実際new A<? extends B>()
にはコンパイルされません。Java 5 以降、一貫して違法でした。
しかし、あなたの元の例はのようなものだったと思いますnew A<X<? extends B>>()
。後者は、最近のバージョンの Java では有効です。
アイデアは、オブジェクトをインスタンス化するときに、型パラメーターの値をワイルドカード以外の型にすることができるということです。? extends B
はワイルドカード タイプであるため、許可されません。ただし、コンポーネントとしてワイルドカード型がありますがX<? extends B>
、ワイルドカード型ではありません。したがって、合法的に呼び出すことができます。new A<X<? extends B>>()
このように考えれば、ルールは理にかなっています。最終的には、ワイルドカード型のようなフィールドまたは変数の宣言され? extends B
た型にすることはできないという、より基本的な規則の副産物です。が次のように定義されている場合A
class A<T> {
T value;
}
その場合、仮説はtype の宣言されnew A<? extends B>().value
たフィールドになります。それは違法であるため、インスタンス化も違法です。しかし、その問題はありません。 ? extends B
new A<X<? extends B>>()