2011-10-26 6 views
5

を振る舞うここに例を示します:無制限のワイルドカードについてはJavaのジェネリック:ArrayListを(無制限ワイルドカード型)、追加してのaddAll方法で直接的で異なっ

ArrayList <?> x = new ArrayList(); 
    ArrayList y = new ArrayList(); 
    x.add("abc"); // Clause 1. Compilation error - No problemo. Understood. 
    x.addAll(y); // Clause 2. No compilation error 

、1は追加することはできません。なぜ最後のステートメントにコンパイルエラーがないのですか?

答えて

7

生の型のメソッドを呼び出すためです。コンパイラは型チェックを実行できません。 yユーザジェネリックを作成すると、addAll(..)は失敗します。

+1

私は意味を見る。タイプ1が知られており、無制限のワイルドカードが追加を妨げる一般的なルールに従うので、第1項は失敗する。第2節では、タイプ要素は不明であるため、レガシーコードとジェネリックコードを混在させる一般的なルールを使用します。私はそれを正しく得たか? – yapkm01

+0

はい - 生の型の場合、ジェネリックのものはすべて破棄されます。 – Bozho

+0

@ yapkm01ジェネリックは言語に遅れて追加されたので、多数の既存の非汎用ライブラリと簡単にやりとりできるように設計しなければならなかった。その結果、コンパイラは生の型の存在下でジェネリックを無視する。 – josefx

関連する問題