3

ジェネリック コレクションと非ジェネリック コレクションが混在するジレンマに直面しています。例: これは新しい Java 5/6 汎用コードです。

List<Integer> list = new ArrayList<Integer>();
list.add(5);

Alpha a = new Alpha();
a.insert(list);

for (Integer integer : list) {
System.out.println(integer);      //will get classCastException
}

非汎用のレガシー コード

public class Alpha {
    public void insert(List list) { 
    list.add(new String("50"));
    }
}   

私は実行時にclassCastExceptionを取得することを知っています。しかし、文字列/犬を追加した後でも、リストのすべての要素を印刷したい. 誰かが私にこれを達成する方法を提案できますか?

4

1 に答える 1

2

確かに - コンパイラがキャストを挿入するのを避ける必要があるだけです:

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        // Nice strongly-typed list...
        List<Integer> list = new ArrayList<Integer>();
        list.add(5);

        // Now abuse it...
        List raw = list;
        raw.add("Bad element");        

        // Don't use the "integer" part, effectively...
        for (Object x : list) {
            System.out.println(x);
        }
    }
}

これで、コンパイラは各要素をIntegerにキャストしていないので、問題ありません。

ただし、これを行う必要がある場合は、コードが根本的に少し壊れていることを示しています。Alpha予期しない項目がリストに追加されないように修正する方がはるかに良いでしょう。

于 2013-02-19T13:43:50.603 に答える