2014-01-29 6 views
0

мой вопрос может быть новичком или даже повторяющимся, но все же я еще не нашел ответа. Метод iterator() возвращает итератор, который имеет несколько методов, скажем, next(). Но где эти методы реализованы? Интерфейсы не могут реализовать методы, верно?Какой класс реализует метод Next() итератора?

Например:

Set keys = selector.selectedKeys(); 
Iterator it = keys.iterator(); 
While (it.hasNext()) 

Кроме того, it не является ссылкой на объект, верно? Что тогда?

+0

проверьте этот http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html –

+0

маленький трюк: object.iterator(). GetClass(). GetName() показывает вам фактический класс объекта, который возвращается как реализация. Если вы действительно должны знать класс реализации, чтобы исследовать проблему, ее легко узнать по этому пути (даже проще, чем использовать отладчик, если вы спросите меня). – Gimby

+0

@ Gimby право, как-то не пытался это сделать, спасибо – StackExploded

ответ

4

Вы правы, интерфейсы не могут реализовать методы.

Красота программирования по отношению к интерфейсам заключается в том, что вам не нужно беспокоиться о том, где они реализованы. Все, что вам нужно знать, это то, что Set#iterator() возвращает класс, который реализует интерфейс Iterator. Таким образом, если возвращаемый класс, содержащий реализацию, должен измениться, это не будет иметь никакого значения для вашего кода.

-1

короче: Set<E>extends суперинтерфейс Iterable<E> и так проходит вниз методы из Iterable<E>

Объект keys таким образом будет иметь доступ к этим методам.

Here - ссылка на документы.

0

В вашем случае объект клавиши Set является конкретной реализацией, как

Все известные исполнители Классы: AbstractSet, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet

и они реализуют Iterable.

, например, TreeSet imeplements Iterable

Все Реализуемые интерфейсы: Сериализуемый, Cloneable, Iterable, Коллекция, NavigableSet, Set, SortedSet

1

iterator() фактически возвращают реализацию из Iterator , т.е. экземпляр класса, который реализует Iterator. Обычно этот класс отличается в зависимости от того, какую коллекцию вы называете iterator().

Это основное преимущество интерфейсов: они просто определяют какой-то контракт, которому должны следовать реализации (в этом случае он определяет несколько методов и как они должны вести себя как), но фактически не обеспечивает реализацию этого контракта, поэтому что реализация может быть определена в соответствующем месте.

0

Интерфейсы не могут реализовать методы, это правильно.

Но it- ссылка на объект, в частности тот, который реализует интерфейс Iterator.

Если интерфейс говорит, что метод возвращает итератор, ответственность за то, что он создает реализацию этого интерфейса, также предоставляет реализацию Iterator, которая может быть возвращена этими методами. Они могут повторно использовать существующий итератор поверх своих внутренних структур данных, или им может понадобиться создать новый.

1

Если вы используете IDE, такую ​​как Eclipse, вы можете запросить список классов, которые реализуют Iterator. Просто выберите слово Iterator в своем коде и нажмите . Ctrl - t. Другие IDE будут иметь свой собственный способ сделать это.

Вы увидите множество различных итераторов, включенных в непубличный код Oracle (и из других используемых вами библиотек). Это экземпляр одного из этих классов, который возвращается, когда вы запрашиваете итератор из набора.

Чтобы узнать, какой конкретный итератор используется с определенным типом объекта, просмотрите исходный код и убедитесь сами! Или print the name по телефону .getClass().getName() на экземпляре итератора.

Например, HashSet использует частный класс итератора HashMap.KeyIterator, который расширяет родительский класс HashMap.HashIterator.

iterator screenshot

0

Think интерфейса, как "договор".

Когда вы пишете программу, и вы говорите «это итератор», то, что понимает компилятор (или интерпретатор, что угодно), означает, что все, объявляющее метод, ожидаемый этим интерфейсом, будет приниматься. Это обеспечивает гибкость вашей программы, и это то, на что ориентированы объектно-ориентированные языки.

Теперь, когда программа должна быть эффективно выполнена, интерпретатор начнет поиск всех внутренних зависимостей, чтобы выяснить, какая часть кода действительно выполнит этот «контракт». Это динамично разрешено JAVA.

В этом случае JAVA увидит, что «это» - итератор «ключей». Затем он также увидит, что «ключи» - это другой интерфейс (Set), который фактически ссылается на конкретную реализацию Set (часть кода, которая может быть фактически выполнена), которая является selector.selectedKeys().

Но если «селектор» - это другой интерфейс, JAVA продолжит поиск до тех пор, пока не найдет кого-то, кто действительно сможет выполнить код, и все будет продолжаться. :-)

0

В этой реализации класса коллекции существует внутренний класс, который реализует интерфейс Iterator. Это внутренний класс, который реализует все методы интерфейса Iterator. Как и ArrayList, внутри его реализации есть

private class Itr implements Iterator<E> { 
     int cursor;  // index of next element to return 
     int lastRet = -1; // index of last element returned; -1 if no such 
     int expectedModCount = modCount; 

     public boolean hasNext() { 
      return cursor != size; 
     } 

     @SuppressWarnings("unchecked") 
     public E next() { 
      checkForComodification(); 
      int i = cursor; 
      if (i >= size) 
       throw new NoSuchElementException(); 
      Object[] elementData = ArrayList.this.elementData; 
      if (i >= elementData.length) 
       throw new ConcurrentModificationException(); 
      cursor = i + 1; 
      return (E) elementData[lastRet = i]; 
     } 

     ... 
} 

Это лучше для вас, чтобы узнать его из исходного кода JDK. Надеюсь, этот ответ поможет вам.

0

Вы должны подойти так.

Set keys = selector.selectedKeys(); 

Приведенное выше утверждение следует читать так:»У меня есть контрольные клавиши, которая указывает некоторую реализацию интерфейса Set. Реализация которой он указывает, можно найти в типе возвращаемого selectedkeys().Реализация может быть hashSet, linkedHashSet или любым другим классом, который реализует Set. Также, если вы проверите установленный интерфейс, он расширяет коллекции, которые inturn расширяет итерабельность. Поэтому из интерфейса становится очевидным, что любая реализация Set, безусловно, реализовать итератор()

Iterator it = keys.iterator(); 

Эта линия должна быть прочитана как «вызов метода итератора реализующего класса, к которому эталонные ключи указывает на» Так получите реализацию Iterator, вам нужно сначала определить реализацию, на которую указывают клавиши. Исходный код имеет все ответы на эти вопросы. Попробуйте и углубитесь в исходный код коллекций, и вы найдете различные реализации Set, и вы увидите, как реализован Iterator.

Смежные вопросы