dur*_*597 4 java generics clone try-catch suppress-warnings
考虑以下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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道您可以通过使用来消除警告,@SuppressWarnings("unchecked")但为什么try/catch块不起作用?放在try/catch那里是浪费时间和精力吗?
这不起作用,因为你没有得到ClassCastException.
无法在运行时检查已清除的列表类型.
当你试图从List中获取一些东西时,你可能会得到一个ClassCastException(而事实证明它不是一个Foo),但是List本身只是一个LinkedList(不知道它的元素类型是什么).
LinkedList<Foo>外观的实例与LinkedList<Bar>运行时完全相同.
警告的原因是运行时系统无法保证您正在执行的转换是正确的(它可以检查LinkedList部分,但不能检查泛型类型).