我有以下类(简化的但仍然是一个工作示例):
class Test<T> {
List<T> l = new ArrayList<>();
public Test() {
}
public void add(Object o) {
l.add((T)o);
}
}
以及测试代码:
Test<Double> t = new Test<>();
t.add(1);
t.add(1.2);
t.add(-5.6e-2);
t.add("hello");
一切都运行得很好,这不是我所期望的。add
方法不应该抛出ClassCastException
吗?如果我添加一个基本相同的get
方法:
public T get(int i) {
return l.get(i);
}
.../...
t.get(1); // OK.
t.get(3); // OK (?)
Double d = t.get(3); // throws ClassCastException
为什么只有在变量赋值时才会抛出异常?如果(T)
强制转换不起作用,我如何强制类型一致性?
发布于 2015-08-12 17:52:31
作为替代解决方案,您可以使用Collections.checkedList
class Test<T> {
List<T> l;
public Test(Class<T> c) {
l = Collections.checkedList(new ArrayList<T>(), c);
}
public void add(Object o) {
l.add((T) o);
}
}
这样,您将获得以下异常:
Exception in thread "main" java.lang.ClassCastException: Attempt to insert
class java.lang.Integer element into collection with element type class java.lang.Double
at java.util.Collections$CheckedCollection.typeCheck(Collections.java:3037)
at java.util.Collections$CheckedCollection.add(Collections.java:3080)
at Test.add(Test.java:13)
https://stackoverflow.com/questions/31960987
复制相似问题