0

以下引发编译错误,因为 foo.getClass() 与 F 以某种方式扩展 Foo 不是同一个捕获组:

public <F extends Foo> F create (final F foo){

     return foo.getClass().cast(foo);

   }

以下工作正常。

return foo;

谢谢。

4

1 回答 1

3

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

于 2012-09-05T20:54:30.427 回答