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。