为什么Java不允许在迭代器上foreach(只在可迭代器上)?
可能的重复:
为什么Java的迭代器不是可迭代的?
据我所知,foreach循环是Java 5中添加的语法糖。所以
Iterable<O> iterable;
for(O o : iterable) {
// Do something
}
基本上将产生与
Iterable<O> iterable;
for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) {
O o = iter.next();
// Do something
}
但是,如果我一开始没有可迭代,而只有一个迭代器(例如,因为一个类提供了两个不同的迭代器),我就不能使用语法 sugar foreach 循环。显然,我仍然可以做普通的旧式迭代。但是,我实际上想做:
Iterator<O> iter;
for(O o : iter /* Iterator<O>, not Iterable<O>! */) {
// Do something
}
当然,我可以做一个假的:Iterable
class Adapter<O> implements Iterable<O> {
Iterator<O> iter;
public Adapter(Iterator<O> iter) {
this.iter = iter;
}
@Override
public Iterator<O> iterator() {
return iter;
}
}
(这实际上是对可迭代API的丑陋滥用,因为它只能迭代一次!
如果它是围绕而不是可迭代设计的,那么人们可以做一些有趣的事情:Iterator
for(O o : iterable.iterator()) {} // Iterate over Iterable and Collections
for(O o : list.backwardsIterator()) {} // Or backwards
Iterator<O> iter;
for(O o : iter) {
if (o.something()) { iter.remove(); }
if (o.something()) { break; }
}
for(O : iter) { } // Do something with the remaining elements only.
有谁知道为什么这种语言是这样设计的?为了避免歧义,如果一个类同时实现 和 ?为了避免程序员的错误,假设“for(O o : iter)”将处理所有元素两次(并忘记获得新的迭代器)?还是有其他原因?Iterator
Iterable
还是有一些我不知道的语言技巧?