java – 通过在子类型上返回Iterator来实现Iterable
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 通过在子类型上返回Iterator来实现Iterable,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1258字,纯文字阅读大概需要2分钟。
内容图文
在以下代码中:
public class Bar { ... }
public class Foo extends Bar { ... }
public class BarIterable implements Iterable<Bar> {
List<Foo> foos = ...
@Override
public Iterator<Bar> iterator() {
return foos.iterator(); // Error: Type mismatch ...
}
}
我在指示的位置出现错误,因为foos.iterator()返回一个Iterable< Foo>而不是Iterable< Bar>.不幸的是,简单的演员表不起作用:
return (Iterator<Bar>) foos.iterator(); // Error: Cannot cast ...
Java也不允许我将BarIterable的定义更改为
public class BarIterable implements Iterable<? extends Bar> { ... // Error: A supertype may not specify any wildcard
什么是解决此问题的好方法,不涉及实现Iterable< Foo>相反(Iterable实现来自另一个不了解Foo的接口)?
我是否必须自己编写一个“解包”每个值的包装器迭代器类?
解决方法:
由于Foo是Bar的子类型,因此您可以直接转换List.
return ((List<Bar>)(List<? extends Bar>) foos).iterator();
并压制警告.
由马库斯编辑:
或者,您可以使用middle-cast-trick直接强制转换迭代器:
return (Iterator<Bar>)(Iterator<? extends Bar>) foos.iterator();
结束编辑
使用Java 8,您可以流式传输元素并构造一个新的Bar类型列表.
@Override
public Iterator<Bar> iterator() {
return foos.stream().<Bar>map((foo) -> foo /* considered a Bar */).collect(Collectors.toList()).iterator();
}
但是你要做的很多中间操作只是为了从超类型的角度来看List.
内容总结
以上是互联网集市为您收集整理的java – 通过在子类型上返回Iterator来实现Iterable全部内容,希望文章能够帮你解决java – 通过在子类型上返回Iterator来实现Iterable所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。