以下引发编译错误,因为 foo.getClass() 与 F 以某种方式扩展 Foo 不是同一个捕获组:
public <F extends Foo> F create (final F foo){
return foo.getClass().cast(foo);
}
以下工作正常。
return foo;
谢谢。
Object#getClass()
返回 aClass<? extends Foo>
,而不是 a Class<F extends Foo>
。
实际结果类型是
Class<? extends |X|>
调用|X|
getClass 的表达式的静态类型的擦除。
的擦除<F extends Foo>
是上限,Foo
。因此Class#cast()
调用大致相当于
return (Foo) foo;
并不是
return (F) foo;
正如您现在可能已经发现的那样, aFoo
不是 a F extends Foo
(声明的方法返回类型),因此编译器不会让您返回 a Foo
。