将Iterator<T>转换为Iterator<U>,其中T是U的子类

5

给定一个类 TU 的子类,将 Iterator<T> 强制转换为 Iterator<U> 是否安全?假设强制转换是安全的,除了以下方式,还有更优雅(且无警告)的方法吗?

Iterator<T> it = <insert your Iterator<T> here...>;
Iterator<U> it2 = (Iterator<U>)(Iterator<? extends U>)it;

我认为该转换不会产生危险的原因如下:

  1. Iterator<?> 不支持插入元素,因此使用 Iterator<U> 替代 Iterator<T> 不会破坏基础数据结构。
  2. Consumer<? super U> 可以转换为 Consumer<? super T>,但反之则不成立。 因此,Iterator<U>::forEachRemaining(Consumer<? super U> action) 将接受在 Iterator<T> 中同一方法的所有合格操作的子集,并且特别地,不会引入执行 Iterator<T> 不支持的操作的方法。
  3. Iterator<U>::remove() 等效于 Iterator<T>::remove()
  4. Iterator<U>::next() 返回 T 的超类。
1个回答

2
"最初的回答"
我同意,我认为没有任何不安全的理由。
我相信:
Iterator<U> it2 = (Iterator) it;

应该足以使转换编译,但如果您想要消除警告,则仍然需要抑制警告。 如果您了解警告的原因并知道它在这种情况下不适用,则抑制警告是可以接受的。

也许您正在使用的代码需要重构以接受Iterator<? extends U>而不是要求Iterator<U>

注:Original Answer翻译成“最初的回答”


我确实按照你的建议重构了代码。这只是一个纯理论性的问题,我认为可能会对社区有所帮助。 - Mischa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接