0

次のJavaコードについて考えてみます。

List<? super Number> list = new ArrayList<>();
Number n = new Integer(1);
Object o = new Object();
list.add(n); // works, apparently Number super Number is alright
list.add(o); // compiler error! 

しかし、なぜそうなのですか?内部的には、型消去はオブジェクトを保持するリストを作成するので、オブジェクト(すべてのクラスのスーパークラスであり、したがって下限ワイルドカードを満たす必要がある)をリストに追加できないのはなぜですか?

4

3 に答える 3

2

コンパイラは、 に(またはそれ自体)listのスーパータイプが含まれているかどうかだけを認識します。である可能性があるため、許可しない必要があります。NumberNumberObjectObjectList<Number>

より完全な説明があります。"? super" について説明している部分までスクロールします。

于 2013-02-22T17:05:38.223 に答える
1

ObjectではありませんNumber

ANumberObjectしかしです。

質問の受け入れられた回答から、これは次の複製です:

したがって、数値のスーパータイプをリストに追加できるというのは正しくありません。これは、限定されたワイルドカードとキャプチャ変換がどのように機能するかではありません。リストにオブジェクトを追加したい場合があるため、リストを宣言しません (できません!)。Number オブジェクトを追加したい (つまり、Number の「コンシューマー」である) ため、単純に List では制限が厳しすぎるためです。

于 2013-02-22T17:04:21.780 に答える
0

List<? super Number> list割り当てることができるリストを定義します。

List<Number>つまり、 aまたは aをそれに割り当てることができますList<Object>

Afaiknew ArrayList<>()は次のようになりますnew ArrayList<Number>()

于 2013-02-22T17:07:42.593 に答える