【问题标题】:Iterating issue of java.lang.Iterable instance [duplicate]java.lang.Iterable实例的迭代问题[重复]
【发布时间】:2020-07-26 02:09:08
【问题描述】:

我的代码

import java.util.*;

public class Test<T> implements Iterable<T> {

    private List<T> persons = new ArrayList<T>();


    public static void main(String[] args) {

        Test<Test> ob = new Test<Test>();
        ob.persons.add(ob);

        for (Test t : ob.iterator()) {

            System.out.println();

        }

    }

    @Override
    public Iterator<T> iterator() {

        return persons.iterator();
    }

}

错误:

Can only iterate over an array or an instance of java.lang.Iterable

两者有什么区别,为什么A不能合法而B可以工作?

    for (Test t : ob.iterator()) {   ----------------------A

        System.out.println();

    }


while (ob.iterator().hasNext()) { -------------------------- B 

        System.out.println();

   }

想知道为什么底层代码不起作用? for 循环中是否发生了不同的事情? Whilefor 都提供了相同的迭代器状态进行迭代。

【问题讨论】:

标签: java iterator


【解决方案1】:

删除迭代器调用:

for (Test t : ob) {

你必须给 for 循环一个 Iterable(或一个数组),而不是一个 Iterator


这个:

while (ob.iterator().hasNext()) {

几乎肯定不会按照您的意思行事。每次评估循环保护时,都会在迭代开始时创建一个新的迭代器,并检查是否有“下一个”元素。除非 ob 最初为空,否则在每次迭代中都将继续为真(除非您在循环内从 ob 中删除一个元素)。

(可能)正确的方法是:

Iterator<T> iterator = ob.iterator();
while (iterator.hasNext()) { // use the same iterator instance throughout iteration.
  T next = iterator.next();
}

【讨论】:

  • ob 在 for 循环中,它的可迭代性如何?只是因为它实现了 Iterable 接口。 ob 是如何返回 iterable 的?同时,它会被显式调用。
  • @Maria ob 是可迭代的,因为它是一个Test&lt;T&gt; 类型的变量,一个实现Iterable&lt;T&gt; 的类。增强的 for 循环是被翻译成 for 循环的语法糖:编译器插入 iterator() 调用。见the language spec
  • 这是做同一件事的不同方式吗?我错了吗?
猜你喜欢
  • 2014-05-23
  • 2015-12-04
  • 2014-08-13
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
相关资源
最近更新 更多