从Iterator <t>转换为Iterator <u>,其中T是U的子类

时间:2019-01-29 14:11:49

标签: java generics

给定T的子类U,将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 个答案:

答案 0 :(得分:2)

我同意,我认为没有任何不安全的理由。

我相信

Iterator<U> it2 = (Iterator) it;

足以进行强制转换编译,但是如果希望在没有警告的情况下使用它,则仍然必须取消显示警告。如果您了解警告的原因并且知道在这种情况下将不适用,那么取消警告就可以了。

也许您正在使用的任何需要Iterator<U>的代码都应重构为接受Iterator<? extends U>