8

我在 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 能更安全吗?

4

2 回答 2

14

我建议使用标准Collections

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

然后继续工作checked。AClassCastException将在插入任何不兼容的实例期间被抛出 - 比之前(即在检索期间)更快(因此更好)。

注意检查你的编译器消息,我敢打赌你有一些警告打印在那里提到不安全/未经检查的代码。你的问题正是编译器试图告诉你的。如果您控制 的签名add,则使其具有通用性——它将为您提供编译时安全性。

public static <T> void add(List<T> list, T t) {
    list.add(t);
}
于 2013-06-08T13:14:26.700 回答
3

我不这么认为。如果该静态add()方法是生活中的事实(您无法控制的事情),那么您无能为力,因为 Java 泛型已实现,因此它们与 Java < 5.0 兼容。

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

public static <T> void add(List<? super T> list, T object) {
    list.add(object)
}
于 2013-06-08T13:16:42.800 回答