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()Class<? extends Foo>ではなく、を返しますClass<F extends Foo>

実際の結果タイプはClass<? extends |X|>|X|getClassが呼び出される式の静的タイプの消去です。

の消去は<F extends Foo>上限Fooです。したがって、Class#cast()呼び出しはほぼ同等です

return (Foo) foo;

ではなく

return (F) foo;

おそらくこれまでに理解しているように、aFooF extends Foo(宣言されたメソッドの戻り型)ではないため、コンパイラーは。を返すことを許可しませんFoo

于 2012-09-05T20:54:30.427 に答える