棘手的部分是该类型包含一个上限的通配符。
Java 8转换不起作用:
Iterator<? extends Person> it = null;
Iterable<? extends Person> it2 = () -> it;
Type mismatch: cannot convert from Iterator<capture#2-of ? extends Person> to Iterator<Person>
答案 0 :(得分:3)
帮助方法可以解决这个问题,而无需禁止警告或投射任何东西:
Iterator<? extends Number> iterator = null;
Iterable<? extends Number> iterable = toIterable(iterator);
public static <T> Iterable<T> toIterable(Iterator<T> it) {
return () -> it;
}
答案 1 :(得分:1)
你从哪里得到这个迭代器?
据我所知,获得Iterator<E>
的唯一方法是通过Iterable<T>.iterator()
。
无论如何,如果你有{{} 1}},您可以使用Iterator
循环重建Iterable
:
while
如果您阅读the docs,有些事情会变得更加清晰。
答案 2 :(得分:0)
一个简单的包装类可以做到这一点。
class IteratorIterable<T> implements Iterable<T> {
final Iterator<T> it;
public IteratorIterable(Iterator<T> it) {
this.it = it;
}
@Override
public Iterator<T> iterator() {
return it;
}
}
public void test() {
Iterator<? extends Person> it = null;
for ( Person person : new IteratorIterable<>(it)) {
System.out.println(person);
}
}
请注意,如果多次使用它,几乎肯定会失败。