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