[英]Why doesn't try-catch resolve the warning in unchecked generics casts?
考虑以下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
放在那里是浪费时间和精力吗?
这不起作用,因为你没有得到ClassCastException。
无法在运行时检查已清除的列表类型。
当你试图从List中获取一些东西时,你可能会得到一个ClassCastException(而事实证明它不是一个Foo),但是List本身只是一个LinkedList(不知道它的元素类型是什么)。
LinkedList<Foo>
的实例在运行时看起来与LinkedList<Bar>
完全相同。
警告的原因是运行时系统无法保证您正在执行的转换是正确的(它可以检查LinkedList部分,但不能检查泛型类型)。
我认为,当您显式地转换任何内容时,编译器不会检查未经检查的异常。 编译器依赖代码编写器进行显式类型转换。
- Erasure
是从类内部和方法等中删除 Type Parameters and Arguments
的过程。
- Box<String>
变为Box
,这称为Raw Type ,在编译时,Generic类和接口将从其Type Arguments中删除,
-这样做是为了在Run time
期间可以获得那些不使用Generics
代码的后向兼容性 。
所以这就是为什么不加以控制的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.