Как Iterator связывается с интерфейсом коллекции - PullRequest
2 голосов
/ 23 сентября 2011

Я новичок в Java.

Java имеет интерфейс Collection

public interface Collection<E> extends Iterable<E>
{ // a lot of other stuff. 
Iterator<E> iterator();  }

Чего я не понимаю, так как интерфейс Iterator связывается с интерфейсом Collection? Когда я смотрю на интерфейс Collection, я вижу, что у него есть метод, который возвращает Iterator. Когда Итератор для Коллекции создан, где JVM ищет создание объекта, который является Итератором?
Спасибо!

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

JVM не делает этого;код, который в конечном итоге реализует абстрактный метод iterator(), просто создает экземпляр соответствующего класса и возвращает его.Например, в классе ArrayList(), который реализует List, который расширяет Collection, существует метод, который реализует iterator(), возвращая экземпляр класса, который понимает, как ArrayList реализован внутри.Этот класс Iterator является частным для пакета java.util - обычно вы никогда не увидите его имя.

2 голосов
/ 23 сентября 2011

Хорошо, так что это все довольно продвинутые java вещи, и это будет довольно сложно объяснить за один раз, но я сделаю все возможное.

ПРЕДПОСЫЛКИ: Если вы не знаете о тех забавных <E> вещи, вы должны немного изучить Java Generics.Кроме того, если вы этого еще не сделали, вам действительно нужно знать, что такое интерфейс.Один действительно базовый способ думать об этом - это обещанная функциональность, которую класс обещает предоставить.

Теперь, чтобы ответить на ваш вопрос: в приведенном выше фрагменте кода есть три интерфейса, и если вы хотите создать свойДля собственного класса коллекции вам необходимо предоставить реализации всех трех:

Первый - Collection.Это простая концепция, которая отображается в реальном мире, это буквально «коллекция» объектов.Я думаю, вы получите это ...

Следующим является Iterable, это определяет единый тип поведения, который должны обеспечивать все коллекции: способность обходить все элементы коллекции при доступе к нимодин за другим, т.е. "перебирать" их.Но это не останавливается там.Как вы указали, функциональность Iterable предоставляется объектами, которые реализуют последний интерфейс:

Iterator: объекты, которые реализуют этот интерфейс, фактически знают, как пройти элементы класса коллекции, они скрывают всеподробности о том, как это на самом деле сделано от их клиентов и доказали несколько простых и простых методов для этого, например, hasNext(), который проверяет, есть ли в коллекции больше вещей для посещения, и next(), который фактически посещает следующую вещь.

фу ...

1 голос
/ 23 сентября 2011

Код метода iterator () определяет, какую конкретную реализацию Iterator следует вернуть.

Все неабстрактные классы, которые реализуют интерфейс Collection, должны предоставлять реализацию для метода iterator ().

...