4

私は次のコードを持っています:

List<? super Integer> numbers = new ArrayList<Number>();
numbers.add(new Integer(10));
Number object = numbers.get(0);  //this doesn't compile??

Object object = numbers.get(0);  //this does compile

次に、私がする場合:

numbers.add(new Object()); //doesn't compile in contradiction to above statement

これの理由は何ですか?

4

4 に答える 4

9

Number objectnumbersコンパイラはそれが のリストであるNumberことを認識していないため、機能しませんInteger。したがってObject、たとえば s のリストである可能性があります。この場合getNumber変数に結果を格納することはできません。したがって、コンパイラはそれを許可しません。

Object object変数には何でも保存できるためget、変数への結果の保存は常に機能するため、許可されています。ObjectObject

numbers.add( new Object() )うまくいかない理由は、 Objects をList<Object>sに追加することだけが許可されているが、aまたは anumbersである可能性が非常に高いため(実際には後者である)、許可されていないためです。List<Integer>List<Number>

基本的には、次のように考える必要があります。 はのリスト、 のリスト、または のリストnumbersである可能性があるため、これら 3 つのいずれかで機能するアクションのみを実行できます。IntegerNumberObject

于 2013-04-12T15:49:39.133 に答える
4

List<? super Integer>のリストだけでなく、のnumbersリストにすることもできます:ObjectsNumbersIntegers

List<? super Integer> numbers = new ArrayList<Object>();

のコンパイル時の型のみに基づいているためnumbers、次のものは型安全であるとは保証できないため、拒否されます。

Number object = numbers.get(0);  //this doesn't compile
于 2013-04-12T15:49:13.310 に答える
1

を宣言することで、とを含むList<? super Integer>スーパークラスである任意のオブジェクトを受け入れることができると言っています。そのため、そのリストにandのインスタンスを追加できるため、リストから取得する際に最も一般的なタイプが考慮されます。IntegerNumberObjectNumberObjectObject

于 2013-04-12T15:54:06.520 に答える
-1

あなたは整数のスーパークラスでリストを読み込もうとしていると思います。Object は Integer の Super である唯一のクラスです。

Number は Object であるため、 と書くことは合法new ArrayList<Number>()です。

しかし、numbersList から取得しようとすると、オブジェクトしか取得できません。Object は Integer の唯一のスーパークラスだからです。

疑問がある場合、または私の理解を正す必要があると思われる場合はお知らせください。

よろしく、ヴェノー

于 2013-04-12T15:59:27.280 に答える