gpt4 book ai didi

java - 为什么 for-each 循环不接受 Iterable 类的实例?

转载 作者:行者123 更新时间:2023-11-29 09:52:58 24 4
gpt4 key购买 nike

Iterable<Position<Integer>> iterable = list.positions();
Iterator<Position<Integer>> iter = iterable.iterator();

while (iter.hasNext()) {
System.out.println(iter.next().getData());
}

上面的代码没有问题。 list只是我编写的 List 类的一个实例。它包含 Integer 类型的元素。

        for (Position<Integer> pos : iterable) {

}

此代码在冒号之后的部分失败。这应该等同于第一段代码,即带有 while 循环的代码。所以我不明白为什么for-each循环会出错。错误显示:“只能遍历数组或 java.lang.Iterable 的实例”- 但是 iterable已经是可迭代的,不是吗?我在这里缺少什么?

以下是实现上述方法和类型的完整代码。

    private class PositionIterator implements Iterator<Position<E>> {
private Position<E> cursor = first();
private Position<E> current = null;

public boolean hasNext() {
return cursor.getData() != null;
}

public Position<E> next() {
if (cursor == null) throw new NoSuchElementException("reached the end of the list");
current = cursor;
cursor = after(cursor);
return current;
}
}

private class PositionIterable implements Iterable<Position<E>> {
public Iterator<Position<E>> iterator() {
return new PositionIterator();
}
}

public Iterable<Position<E>> positions() {
return new PositionIterable();
}

这些是另一个名为 PositionalList<E> 的类中的嵌套类.为了使这篇文章紧凑,我决定省略外部类(class)。它只是一组典型的 List 类的 getter 和 setter 方法。

public interface Iterable<E> {
public Iterator<E> iterator();
}

^这就是 PositionIterable 实现的 Iterable 接口(interface)

public interface Iterator<E> {
boolean hasNext();
E next();
}

^这就是Iterator界面。

最佳答案

增强的 for 循环接受 Iterable,而不是 Iteratoriter 是一个迭代器

因此:

for (Position<Integer> pos : iter)

应该是:

for (Position<Integer> pos : iterable)

编辑:根据评论,您的问题一定是通过您的自定义 Iterable 接口(interface)隐藏了 java.lang.Iterable。如果您的 iterable 变量是您自定义的 Iterable 接口(interface)的类型,则它不能被增强的 for 循环使用,它接受 java.lang.Iterable

关于java - 为什么 for-each 循环不接受 Iterable 类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30024293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com