Por que Java não permite foreach em iteradores (apenas em iteráveis)? [duplicado]

Duplicata Possível:
Por que o iterador do Java não é um iterável?

Forma idiomática de usar para cada loop dado um iterador?

Podemos usar loop for-each para iterar os objetos do tipo Iterator?

O loop foreach é, tanto quanto eu sei sintaxe de açúcar adicionado em Java 5. Então

Iterable<O> iterable;
for(O o : iterable) {
    // Do something
}

essencialmente produzirá o mesmo bytecode que

Iterable<O> iterable;
for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) {
    O o = iter.next();
    // Do something
}

No entanto, se eu não tiver um iterável em primeiro lugar, mas apenas um iterador (digamos, porque uma classe oferece dois iteradores diferentes), não posso usar o loop de sintaxe sugar foreach. Obviamente, ainda posso fazer a iteração simples e antiga. No entanto, eu realmente gostaria de fazer:

Iterator<O> iter;
for(O o : iter /* Iterator<O>, not Iterable<O>! */) {
     // Do something
}

E é claro que eu posso fazer uma falsaIterable:

class Adapter<O> implements Iterable<O> {
    Iterator<O> iter;

    public Adapter(Iterator<O> iter) {
        this.iter = iter;
    }

    @Override
    public Iterator<O> iterator() {
        return iter;
    }
}

(O que de fato é um abuso feio da Iterable API, já que ela só pode ser iterada uma vez!)

Se ele foi projetado em tornoIterator em vez de iterable, pode-se fazer uma série de coisas interessantes:

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.

Alguém sabeporque a linguagem foi projetada dessa maneira? Para evitar ambigüidade, se uma classe implementasseIterator eIterable? Para evitar erros do programador que supõem que "for (O o: iter)" processará todos os elementos duas vezes (e esqueça de obter um iterador novo)? Ou há algum outro motivo para isso?

Ou há algum truque de linguagem que eu simplesmente não conheço?

questionAnswers(5)

yourAnswerToTheQuestion