使用泛型会导致未经检查的转换警告

Pop*_*ops 7 java generics casting

我有以下代码

String innerText = null;
innerText = this.getException(detail.getChildElements());
Run Code Online (Sandbox Code Playgroud)

引起这个警告

类型安全:Iterator类型的表达式需要未经检查的转换以符合Iterator

引用的方法是

private String getException(Iterator<OMElementImpl> iterator) { ... }
Run Code Online (Sandbox Code Playgroud)

另一种方法getChildElements()是在我无法触及的JAR文件中.没有其他警告或错误.

从谷歌搜索,似乎通常的方法摆脱这种警告是

@SuppressWarnings("unchecked")
String innerText = this.getException(detail.getChildElements());
Run Code Online (Sandbox Code Playgroud)

因为编译器不能提前保证安全,但我宁愿避免使用,SuppressWarnings如果可能...有更好的方法吗?

编辑:getChildElements()是记录在这里

eri*_*son 16

可以取消警告,但是如果这样做,您将100%依赖第三方库,并放弃Java泛型类型的保证:ClassCastException在运行时引发的任何内容都将在显式转换时发生.

我们的编码标准是仅在我们能够证明代码是安全类型时才禁止警告- 我们将包外的任何调用视为黑盒子,并且不依赖于有关原始集合内容的任何注释.因此,抑制极为罕见.通常,如果代码是类型安全的,编译器可以确定它,尽管有时我们必须给它一些帮助.少数例外涉及不从私有上下文"逃逸"的泛型类型的数组.

如果您不完全信任第三方库,请创建一个新集合,并在将其转换为内容后添加内容OMEElementImpl.这样一来,如果库中有一个bug,你就会马上发现它,而不是让时间和空间上的代码远远超过ClassCastException.

例如:

Iterator<?> tmp = detail.getChildElements();
Collection<OMElementImpl> elements = new ArrayList<OMElementImpl>();
while (tmp.hasNext())
  elements.add((OMElementImpl) tmp.next()); /* Any type errors found here! */
String innerText = getException(elements.iterator());
Run Code Online (Sandbox Code Playgroud)

请记住,仿制药不是为了使代码看起来漂亮而且需要更少的打字而发明的!泛型的承诺是这样的:如果代码在没有警告的情况下编译,则保证代码是安全的.这就对了.当忽略或抑制警告时,没有强制转换操作符的代码可能会神秘地引发警告ClassCastException.


更新:在这种情况下,特别是,假设结果getChildElements是迭代器似乎是非常危险的OMElementImpl.充其量,你可以假设它们是OMElement,并且这只是从类中隐含的,而不是特别是方法上的任何东西.