为什么try-catch不会在未经检查的泛型强制转换中解决警告?

时间:2012-10-23 12:10:38

标签: java generics try-catch clone 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
        }
    }
}

我知道您可以使用@SuppressWarnings("unchecked")删除警告,但为什么try/catch阻止不起作用?将try/catch放在那里是浪费时间和精力吗?

3 个答案:

答案 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

因此,这就是未经检查的原因。