2015-12-13 17 views
8

私はOJCPAのコードスニペットを見ていて、コンパイラが次のコードでエラーをスローしない理由を混乱させています。ジェネリック型をジェネリック型に割り当てるときにコンパイラエラーが発生するのはなぜですか?

List l = new ArrayList(); 
l.add("a"); 
l.add("b"); 
l.add(1); 

List<String> strList = new ArrayList<>(); 
strList = l; //#1 - Why does the assignment compile? 

for(String s: strList) { 
     System.out.println(s); //#2 - It makes sense that it then throws a ClassCastException 
} 

私は、コンパイラは、生の型としてリストLを参照してくださいだろうし、ジェネリック医薬品は不変であるので、それは> List型の<文字列ではないとして、それは、コンパイラエラーを生成することを考えました。

ありがとうございました。

答えて

7

下位互換性があります。

あなたはListStringのSを返すレガシーメソッドを呼び出していると仮定しますが、ジェネリックはJavaに追加された前に、それが書かれていたので、それは生Listを返します。

List<String> strList = someOldMethodThatReturnsRawList(); 

そうでなければ、あなたがそのメソッドを呼び出すために、あなたの新しいコードで生Listタイプを使用して維持する必要があります:

あなたはこの行はコンパイルを渡したいと思います。

+0

詳細情報https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html – AdamSkywalker

+1

コーデックが知っていたキャストやその他の構文の表示が必要な場合があります/彼女はやっていた。しかし、私はその時代に取り組んでいたさまざまな競合する設計基準を認識していないので、彼らにはそれが良い理由があると信じていなければなりません。 :-) –

+0

タイプされたクラスに生の型を割り当てることができますか? – binarycreations

関連する問題