给定T
的子类U
,将Iterator<T>
强制转换为Iterator<U>
是否安全?并假设演员表是安全的,除了以下以外,还有其他更优雅(且无警告)的方法吗?
Iterator<T> it = <insert your Iterator<T> here...>;
Iterator<U> it2 = (Iterator<U>)(Iterator<? extends U>)it;
我认为演员阵容不危险的原因是:
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的超类; 答案 0 :(得分:2)
我同意,我认为没有任何不安全的理由。
我相信
Iterator<U> it2 = (Iterator) it;
足以进行强制转换编译,但是如果希望在没有警告的情况下使用它,则仍然必须取消显示警告。如果您了解警告的原因并且知道在这种情况下将不适用,那么取消警告就可以了。
也许您正在使用的任何需要Iterator<U>
的代码都应重构为接受Iterator<? extends U>
。