给定一个类T的子类U,是否可以安全地转换Iterator<T>为Iterator<U>?并且假设演员阵容是安全的,除了以下方面之外,还有更优雅(并且没有警告)的方式:
Iterator<T> it = <insert your Iterator<T> here...>;
Iterator<U> it2 = (Iterator<U>)(Iterator<? extends U>)it;
Run Code Online (Sandbox Code Playgroud)
演员为什么不危险的原因是:
Iterator<?>不支持插入元素,因此不存在使用Iterator<U>而不是损坏底层数据结构的危险Iterator<T>;Consumer<? super U>是可转换的,Consumer<? super T>但反之亦然.因此,Iterator<U>::forEachRemaining(Consumer<? super U> action)将接受符合相同方法的所有动作的子集,Iterator<T>并且特别是不引入执行不支持的动作的方式Iterator<T>;Iterator<U>::remove()相当于Iterator<T>::remove();Iterator<U>::next() 返回T的超类;我同意,我认为没有任何理由不安全。
我相信
Iterator<U> it2 = (Iterator) it;
Run Code Online (Sandbox Code Playgroud)
应该足以使强制转换编译,但如果您希望在没有警告的情况下进行警告,您仍然必须抑制警告。如果您了解警告的原因并且知道它在这种情况下不适用,则可以抑制警告。
也许您使用的任何代码都Iterator<U>需要重构以接受Iterator<? extends U>。
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |