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

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那里是浪费时间和精力吗?

Thi*_*ilo 8

这不起作用,因为你没有得到ClassCastException.

无法在运行时检查已清除的列表类型.

当你试图从List中获取一些东西时,你可能会得到一个ClassCastException(而事实证明它不是一个Foo),但是List本身只是一个LinkedList(不知道它的元素类型是什么).

LinkedList<Foo>外观的实例与LinkedList<Bar>运行时完全相同.

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