如何转换Iterator <! - ?将Person - >扩展为Iterable?

时间:2017-08-25 07:47:19

标签: java generics

棘手的部分是该类型包含一个上限的通配符。

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>

3 个答案:

答案 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);
    }
}

请注意,如果多次使用它,几乎肯定会失败。