gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:06:42 24 4
gpt4 key购买 nike

我有以下代码

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

导致这个警告

Type safety: The expression of type Iterator needs unchecked conversion to conform to Iterator

引用的方法是

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

另一种方法 getChildElements() 位于我无法访问的 JAR 文件中。没有其他警告或错误。

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

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

因为编译器无法提前保证安全,但我更愿意尽可能避免使用 SuppressWarnings...有没有更好的方法?

编辑:getChildElements() 已记录 here

最佳答案

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

我们的编码标准是只有当我们可以证明代码是类型安全的时候才抑制警告——我们将包外的任何调用都视为黑盒,并且不依赖任何关于原始集合的内容。所以,镇压是极其罕见的。通常,如果代码是类型安全的,编译器可以确定它,尽管有时我们必须给它一些帮助。少数异常(exception)涉及不从私有(private)上下文中“转义”的泛型类型数组。

如果您不完全信任第三方库,请创建一个新的集合,并将其转换为OMElementImpl 后添加内容。这样,如果库中有错误,您会立即发现它,而不是让一些在时间和空间上相去甚远的代码因 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());

请记住,发明泛型并不是为了让代码看起来更漂亮并且需要更少的输入!泛型的 promise 是这样的:如果编译时没有警告,则保证您的代码是类型安全的。就是这样。当警告被忽略或抑制时,没有转换运算符的代码会神秘地引发 ClassCastException


更新:在这种情况下,尤其是假设 getChildElements 的结果是 OMElementImpl 的迭代器似乎风险极大。充其量,您可能假设它们是 OMElement,这只是类中隐含的,而不是方法中的任何内容。

关于java - 使用泛型会导致未经检查的转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1510100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com