Think интерфейса, как "договор".
Когда вы пишете программу, и вы говорите «это итератор», то, что понимает компилятор (или интерпретатор, что угодно), означает, что все, объявляющее метод, ожидаемый этим интерфейсом, будет приниматься. Это обеспечивает гибкость вашей программы, и это то, на что ориентированы объектно-ориентированные языки.
Теперь, когда программа должна быть эффективно выполнена, интерпретатор начнет поиск всех внутренних зависимостей, чтобы выяснить, какая часть кода действительно выполнит этот «контракт». Это динамично разрешено JAVA.
В этом случае JAVA увидит, что «это» - итератор «ключей». Затем он также увидит, что «ключи» - это другой интерфейс (Set), который фактически ссылается на конкретную реализацию Set (часть кода, которая может быть фактически выполнена), которая является selector.selectedKeys().
Но если «селектор» - это другой интерфейс, JAVA продолжит поиск до тех пор, пока не найдет кого-то, кто действительно сможет выполнить код, и все будет продолжаться. :-)
проверьте этот http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html –
маленький трюк: object.iterator(). GetClass(). GetName() показывает вам фактический класс объекта, который возвращается как реализация. Если вы действительно должны знать класс реализации, чтобы исследовать проблему, ее легко узнать по этому пути (даже проще, чем использовать отладчик, если вы спросите меня). – Gimby
@ Gimby право, как-то не пытался это сделать, спасибо – StackExploded