代码之家  ›  专栏  ›  技术社区  ›  Pops Atula

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

  •  7
  • Pops Atula  · 技术社区  · 16 年前

    String innerText = null;
    innerText = this.getException(detail.getChildElements());
    

    导致此警告的原因

    迭代器

    引用的方法是

    private String getException(Iterator<OMElementImpl> iterator) { ... }
    

    另一种方法,, getChildElements() ,在一个我无法触摸的JAR文件中。没有其他警告或错误。

    从谷歌上看,摆脱此类警告的通常方法似乎是

    @SuppressWarnings("unchecked")
    String innerText = this.getException(detail.getChildElements());
    

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

    编辑: here

    1 回复  |  直到 16 年前
        1
  •  16
  •   erickson    16 年前

    可以 抑制警告,但如果这样做,您将100%依赖于第三方库,并放弃Java泛型类型的保证:任何 ClassCastException 在运行时引发的事件将在显式强制转换时发生。

    证明 代码是类型安全的,我们将包外的任何调用视为一个黑盒,并且不依赖任何关于原始集合内容的注释。所以,抑制是极其罕见的。通常,如果代码是类型安全的,编译器可以确定它,尽管有时我们必须给它一些帮助。少数例外情况涉及不从私有上下文“转义”的泛型类型数组。

    OMEElementImpl . 这样,如果库中有一个bug,您就可以立即找到它,而不是让一些在时间和空间上遥远的代码被一个错误炸毁 类卡斯特例外 .

    例如:

    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());
    

    如果您的代码在编译时没有警告,则保证它是类型安全的。 类卡斯特例外 .


    getChildElements OMElementImpl . 充其量,你可能会认为他们是 OMElement ,而这只是从类中暗示出来的,而不是方法中的任何内容。