以下引发编译错误,因为 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。