什么是未选中的投射,如何检查?

2022-09-01 02:56:24

我想我明白了未经检查的演员意味着什么(从一个演员到另一个不同类型的演员),但是“检查”演员阵容意味着什么?如何检查强制转换,以便在 Eclipse 中避免此警告?


答案 1

为了详细说明彼得所写的内容:

从非泛型类型到泛型类型的强制转换在运行时可能工作得很好,因为在编译过程中会擦除泛型参数,因此我们只剩下合法的强制转换。但是,由于对类型参数的错误假设,代码可能会在以后因意外情况而失败。例如:ClassCastException

    List l1 = new ArrayList();
    l1.add(33);
    List<String> l2 = (List<String>) l1;
    String s = l2.get(0);

第 3 行中未选中的警告表示编译器无法保证类型安全,从某种意义上说,以后可能会发生意外的 ClassCastException。实际上,这发生在第 4 行,它执行隐式转换。


答案 2

未经检查的强制转换意味着您正在(隐式或显式)从泛型类型强制转换为非限定类型,反之亦然。例如,这条线

Set<String> set = new HashSet();

将产生这样的警告。

通常,出现此类警告是有充分理由的,因此应尝试改进代码,而不是禁止显示警告。引用自 Effective Java,第 2 版:

尽可能消除所有未经检查的警告。如果消除所有警告,则可以确保代码是类型安全的,这是一件非常好的事情。这意味着你不会在运行时得到 a,它增加了你对程序按照预期运行的信心。ClassCastException

如果无法消除警告,并且能够证明引发警告的代码是类型安全的,则(并且仅到那时)使用注释禁止显示警告。如果你在没有首先证明代码是类型安全的的情况下禁止警告,那么你只会给自己一种虚假的安全感。代码可以在不发出任何警告的情况下进行编译,但它仍然可以在运行时引发 a。但是,如果您忽略了您知道安全的未经检查的警告(而不是禁止显示它们),则不会注意到何时出现代表实际问题的新警告。新的警告将在你没有沉默的所有假警报中迷失。@SuppressWarnings("unchecked")ClassCastException

当然,消除警告并不总是像上面的代码那样容易。如果看不到你的代码,就没有办法告诉如何让它安全。


推荐