foo.getClass()はFがFooを拡張するのと同じキャプチャグループではないため、以下はコンパイルエラーをスローします。
public <F extends Foo> F create (final F foo){
return foo.getClass().cast(foo);
}
以下は正常に動作します。
return foo;
ありがとう。
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;
おそらくこれまでに理解しているように、aFoo
はF extends Foo
(宣言されたメソッドの戻り型)ではないため、コンパイラーは。を返すことを許可しませんFoo
。