考虑以下MCVE:
public class MyClass {
private LinkedList<Foo> myList = new LinkedList<Foo>();
// Some irrevelant stuff which includes loading myList
public void myMethod() {
LinkedList<Foo> newList;
try {
newList = (LinkedList<Foo>) myList.clone();
} catch (ClassCastException e) {
// do something in case java screws up
}
}
}
我知道您可以使用@SuppressWarnings("unchecked")
删除警告,但为什么try/catch
阻止不起作用?将try/catch
放在那里是浪费时间和精力吗?
答案 0 :(得分:7)
这不起作用,因为你没有得到ClassCastException。
无法在运行时检查已删除的列表类型。
当你试图从List中取出一些东西时,你可能会得到一个ClassCastException(而事实证明它不是一个Foo),但是List本身只是一个LinkedList(不知道它的元素类型是什么)。 / p>
LinkedList<Foo>
的实例在运行时看起来与LinkedList<Bar>
完全相同。
警告的原因是运行时系统无法保证您正在执行的强制转换是正确的(它可以检查LinkedList部分,但不能检查泛型类型)。
答案 1 :(得分:0)
我认为当你明确地投射任何东西时,编译器不会检查未经检查的异常。编译器依赖代码编写器进行显式类型转换。
答案 2 :(得分:0)
- Erasure
是一个过程,其中Type Parameters and Arguments
从类内删除,方法等
- Box<String>
变为Box
,这称为原始类型,其中通用类和接口被剥离在编译时输入参数
- 这样做是为了在Run time
期间可以获得不的后方兼容性 >使用了Generics
。
因此,这就是未经检查的原因。