3 回答

TA贡献2039条经验 获得超7个赞
对于我的$ 0.02,我完全同意Iterator不应该实现Iterable,但是我认为Enhanced for循环应该接受其中任何一个。我认为整个“使迭代器可迭代”的论点是作为一种解决语言缺陷的方法而提出的。
引入增强的for循环的全部原因是,它“消除了对集合和数组进行迭代时迭代器和索引变量的繁琐和易错性” [ 1 ]。
Collection<Item> items...
for (Iterator<Item> iter = items.iterator(); iter.hasNext(); ) {
Item item = iter.next();
...
}
for (Item item : items) {
...
}
那么为什么同一个参数对迭代器不成立?
Iterator<Iter> iter...
..
while (iter.hasNext()) {
Item item = iter.next();
...
}
for (Item item : iter) {
...
}
在这两种情况下,都已删除了对hasNext()和next()的调用,并且在内部循环中没有对迭代器的引用。是的,我知道可以重复使用Iterables来创建多个迭代器,但是所有这些事情都发生在for循环之外:在循环内,每次迭代器返回的项都只能向前推进一个。
同样,允许这样做也将使for循环易于用于枚举,正如其他地方所指出的,它类似于Iterators not Iterables。
因此,不要使Iterator实现Iterable,而是更新for循环以接受其中任何一个。
干杯,
添加回答
举报