在java中混合泛型和非泛型集合

时间:2013-02-19 13:39:44

标签: generics

我在混合通用和非通用集合时面临两难选择。 例如: 这是新的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。 但是我想在添加字符串/狗之后打印列表的所有元素。 有人可以建议我如何实现这个目标?

1 个答案:

答案 0 :(得分: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以避免将意外的项目添加到列表中会更好。