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在运行时抛出.但是,如果您忽略了您认为安全的未经检查的警告(而不是抑制它们),您将不会注意到何时出现一个代表真正问题的新警告.在你没有沉默的所有误报中,新的警告会丢失.
当然,消除上面代码的警告并不总是那么容易.没有看到你的代码,就没有办法告诉如何使它安全.
| 归档时间: |
|
| 查看次数: |
29461 次 |
| 最近记录: |