私はいくつかのジェネリックを試していて、これに気づきました。
class D extends C {}
class C extends B {}
class B extends A {}
class A {}
class Z<E extends B> {}
class temp {
public static void main(String[] args) {
Z z1 = new Z();
Z<B> z2 = new Z<B>();
Z<C> z3 = new Z<C>();
Z<D> z4 = new Z<D>();
Z<A> z5 = new Z<A>(); //compile error - E can be subsituted only until B
Z<? extends A> z5 = null; //no compile error
}
}
これでコンパイルエラーが発生しないのはなぜですか?
Z<? extends A> z5 = null;
クラス Z には B までの上限がありますが、A まで拡張するワイルドカード宣言を使用できます。もちろん、それをインスタンス化することはできません
Z<? extends A> z5 = new Z<A>(); //Not allowed
しかし、これはコンパイル エラーではないでしょうか。なぜこの宣言を許可するのですか?
編集: z5 のインスタンス化を修正