6

考虑以下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

4

3 回答 3

10

那是行不通的,因为您没有为此获得 ClassCastException。

在运行时无法检查列表的已擦除类型。

当您尝试从 List 中获取某些内容(结果不是 Foo)时,您可能会收到 ClassCastException,但 List 本身只是一个 LinkedList(不知道它的元素类型可以是什么)。

的实例LinkedList<Foo>看起来与LinkedList<Bar>运行时的 a 完全一样。

警告的原因是运行时系统不能保证你正在做的转换是正确的(它可以检查 LinkedList 部分,但不能检查泛型类型)。

于 2012-10-23T12:12:34.277 回答
0

我认为,当您显式转换任何内容时,编译器不会检查未经检查的异常。编译器依赖代码编写器进行显式类型转换。

于 2012-10-23T12:13:01.803 回答
0

- Erasure是一个过程,其中从类内部和方法等Type Parameters and Arguments中删除。

- Box<String>变成Box了,这被称为Raw Type,其中泛型类和接口在编译期间被剥离了它们的类型参数,

-这样做是为了在向后兼容Run time期间可以获得那些使用.Generics

所以这就是不检查的原因。

于 2012-10-23T12:30:30.660 回答