什么是未经检查的演员表,如何查看?

SIr*_*lot 31 java eclipse casting unchecked

我想我得到了什么未经检查的演员意味着(从一个到另一个不同类型的演员),但是"检查"演员是什么意思?如何检查演员表以便我可以在Eclipse中避免此警告?

Eya*_*der 43

更多地阐述彼得所写的内容:

从非泛型类型到泛型类型的转换在运行时可以正常工作,因为通用参数在编译期间被擦除,因此我们留下合法的转换.但是,由于关于类型参数的错误假设,代码可能会在以后因意外的ClassCastException而失败.例如:

List l1 = new ArrayList();
l1.add(33);
ArrayList<String> l2 = (ArrayList<String>) l1;
String s = l2.get(0);
Run Code Online (Sandbox Code Playgroud)

第3行中未经检查的警告表示编译器不再能够保证类型安全,因为稍后可能会发生意外的ClassCastException.这发生在第4行,执行隐式转换.


Pét*_*rök 34

未经检查的强制转换意味着您(隐式或显式)从泛型类型转换为非限定类型或反之.比如这条线

Set<String> set = new HashSet();
Run Code Online (Sandbox Code Playgroud)

会产生这样的警告.

通常这种警告是有充分理由的,因此您应该尝试改进代码而不是抑制警告.引自Effective Java,第2版:

消除所有未经检查的警告.如果你消除所有警告,你可以放心,你的代码是类型安全的,这是一件非常好的事情.这意味着您不会ClassCastException在运行时获得它,并且它会增加您对程序按预期运行的信心.

如果您无法消除警告,并且您可以证明引发警告的代码是类型安全的,那么(并且仅在此时)使用@SuppressWarnings("unchecked")注释来抑制警告.如果你在没有首先证明代码是类型安全的情况下禁止警告,那么你只是给自己一种虚假的安全感.代码可以编译而不会发出任何警告,但它仍然可以ClassCastException在运行时抛出.但是,如果您忽略了您认为安全的未经检查的警告(而不是抑制它们),您将不会注意到何时出现一个代表真正问题的新警告.在你没有沉默的所有误报中,新的警告会丢失.

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

  • -1因为答案没有解决"如何检查演员"部分问题.好的,我们知道我们应该检查演员,我们怎么做**? (21认同)