Почему Java не позволяет использовать foreach для итераторов (только для итераторов)? [Дубликат]
Possible Duplicate:
Why is Java's Iterator not an Iterable?
Idiomatic way to use for-each loop given an iterator?
Can we use for-each loop for iterating the objects of Iterator type?
Насколько я знаю, синтаксический сахар добавлен в Java 5. Цикл foreach.
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
}
Однако, если у меня нет итерируемого в первую очередь, а только итератора (скажем, потому что класс предлагает два разных итератора), я не могу использовать синтаксический сахарный цикл 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;
}
}
(Что на самом деле является уродливым злоупотреблением Iterable 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.
Кто-нибудь знаетwhy язык был разработан таким образом? Чтобы избежать двусмысленности, если класс будет реализовывать обаIterator
а такжеIterable
? Чтобы избежать ошибок программиста, которые предполагают, что «для (O o: iter)» обработает все элементы дважды (и забудет получить свежий итератор)? Или есть какая-то другая причина для этого?
Или есть какой-то языковой трюк, которого я просто не знаю?