我在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可以更安全吗?
答案 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)
}