集合比通用类型的标准列表更安全?

时间:2013-06-08 13:10:32

标签: java generics java-6

我在Java中使用泛型,但它并不像我想的那么好

public static void add(List l, Object o) {
    l.add(o);
}

public static void main(String[] args) throws Exception {
    List<Integer> list = new ArrayList<Integer>();
    add(list, "1.23");
    add(list, 1.23);
    System.out.println(list);
}

所有这些编译和工作。当我从list获得一个值时,会抛出异常。

Java 6可以更安全吗?

2 个答案:

答案 0 :(得分:14)

我建议使用标准Collections

List<Integer> checked = Collections.checkedList(list, Integer.class);

然后开始checked。插入任何不合规的实例时会抛出ClassCastException - 比之前更快(因此更好)(即在检索期间)。

N.B。检查你的编译器消息,我敢打赌你在提到不安全/未经检查的代码时会打印一些警告..你的问题正是编译器试图告诉你的。如果您控制add的签名,请将其设为通用 - 它将为您提供编译时安全性。

public static <T> void add(List<T> list, T t) {
    list.add(t);
}

答案 1 :(得分:3)

我不这么认为。如果静态add()方法是生活中的事实(你无法控制),那么你就无法做到,因为实现了Java泛型,因此它们与Java兼容&lt; 5.0。

但是,如果您能够更改add()方法的签名,则可以简单地强制执行类型检查,以便在main()方法中出现编译器错误:

public static <T> void add(List<? super T> list, T object) {
    list.add(object)
}