3

私はいくつかのジェネリックを試していて、これに気づきました。

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 のインスタンス化を修正

4

1 に答える 1

3

あなたが求めていることを見る1つの方法は、Javaがあなたに書くことを許可するかどうかだと思います

Z<?> z;

より一般的に言えば、Java は任意のジェネリック型を無制限のワイルドカードで使用できるようにする必要があります。答えが「はい」だと思うなら、そして私がそう思うなら、あなたは答えを得た.

于 2013-06-03T08:08:32.183 に答える