编译器抱怨转换到同一个捕获组

时间:2012-09-05 20:52:58

标签: java generics

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

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

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

   }

以下工作正常。

return foo;

感谢。

1 个答案:

答案 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