假设我有以下接口和实现类:
interface Foo<FooType extends Foo<FooType>> {
FooType copy();
}
class Bar implements Foo<Bar> {
public Bar copy() {
return new Bar();
}
}
如果我尝试这样做:
public <FooType extends Foo<FooType>> FooType getFoo() {
return new Bar();
}
我收到编译错误“类型不匹配:无法从 Bar 转换为 FooType”。为什么?
我可以通过重写这样的函数来“修复”这个问题:
@SuppressWarnings("unchecked")
public <FooType extends Foo<FooType>> FooType getFoo() {
return (FooType) new Bar();
}
但是假设我有这样的功能:
public <FooType extends Foo<FooType>> void printFoo(FooType foo) {
System.out.println(foo.toString());
}
如果我尝试这样做:
printFoo(getFoo());
我收到以下编译错误:
Bound mismatch: The generic method printFoo(FooType) is not applicable
for the arguments (Foo<Foo<FooType>>). The inferred type Foo<Foo<FooType>>
is not a valid substitute for the bounded parameter <FooType extends Foo<FooType>>
笏?getFoo() 的返回类型实际上与 printFoo() 的参数类型相同!
这些错误还是我错过了什么?