2017-06-06 10 views

答えて

1

これは、コンパイルを渡し:

LinkedList<?> list1 = new LinkedList<String>(); 

これはない:

LinkedList<Object> list2 = new LinkedList<String>(); 

すなわちLinkedList<?>変数は、任意のLinkedList<SomeType>を割り当てることができます。 LinkedList<Object>変数にはLinkedList<Object>(または使用することをお勧めしない生のLinkedList)しか割り当てることができません。 add次一方

LinkedList<?> list1 = new LinkedList<String>(); 
list1.add("x"); 

は、コンパイルを通らない、追従して処理が行われます。

LinkedList<Object> list2 = new LinkedList<Object>(); 
list2.add("x"); 
+0

は、なぜ私はリスト1に任意の文字列を追加することはできませんか? – karan

+0

ここでの主なポイントは、ジェネリックは_invariant_だと思います。ジェネリック型の安全性を節約するために行われました。それ以外の場合は、次のコードでクラスキャスト例外がスローされることがあります: 'List li = new ArrayList (); リスト ln = li; //違法 ln.add(新規Float(3.1415)); 'だから'? 'はそのような目的のために作成されました。 – asdasdsdf

+0

@karan 'list1'に汎用LinkedList(' LinkedList '、' LinkedList 'など)を割り当てることができるので、コンパイラはどの要素を安全に追加できるのか分かりません。 – Eran

関連する問題