Почему 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)» обработает все элементы дважды (и забудет получить свежий итератор)? Или есть какая-то другая причина для этого?

Или есть какой-то языковой трюк, которого я просто не знаю?

Ответы на вопрос(5)

Ваш ответ на вопрос