When the enhanced for loop (foreach loop) was added to Java, it was made to work with a target of either an array or Iterable.
for ( T item : /*
public class DescendingIterableDequeAdapter implements Iterable {
private Deque original;
public DescendingIterableDequeAdapter(Deque original) {
this.original = original;
}
public Iterator iterator() {
return original.descendingIterator();
}
}
And then
for (T item : new DescendingIterableDequeAdapter(deque)) {
}
So, for each such case, you'd need a special adapter. I don't think it is theoretically possible to do what you want, because the facility has to know what iterator-returning methods exist, so that it can call them.
As for your additional question - I believe because the for-each loop was actually meant to make things shorter for general-purpose scenarios. And calling an additional method makes the syntax more verbose. It could've supported both Iterable and Iterator, but what if the object passed implemented both? (would be odd, but still possible).