Когда listIterator используется в качестве ссылочного типа, объект, назначенный ему, должен его реализовать?
Для ссылочной переменной, тип которой является интерфейсом, объект, который вы ей назначаете, должен реализовывать интерфейс. Как это относится к интерфейсу List Iterator, которому назначается объект, принадлежащий к классу, который его не реализует (не удалось найти отношение в иерархии)
List<String> list = new ArrayList<String>();
ListIterator<Type> it = list.listIterator(list.size());---1
Я читал, что Iterator является суперклассом ListIterator, но я не смог найти связь между ListIterator и ArrayList или List.
С List
Интерфейс, который я знаю, имеет метод listIterator(), который помогает назначить итератор для коллекций. Но какой класс на самом деле реализует ListIterator для его назначения в Иерархии.
Я пытаюсь понять утверждение 1 и как ему присвоено это значение.
1 ответ
Следуя предложению комментария immibis, давайте взглянем на реализацию listIterator(int):
public ListIterator<E> listIterator(int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
Видим, тип возвращаемого значения ListIterator<E>
, что именно то, что мы ожидали (как определение класса ArrayList public class ArrayList<E>
). Например, если у нас есть ArrayList<String>
тип возвращаемого метода будет ListIterator<String>
,
Но что это? Это не ListIterator
мы создаем, но экземпляр ListItr
, Давайте посмотрим на его определение:
private class ListItr extends Itr implements ListIterator<E>
Это внутренний класс ArrayList, и он определяет некоторый класс, который реализует интерфейс ListIterator.
Итак, глядя на ваш код, мы могли бы добавить несколько скобок, чтобы прояснить, что происходит:
ListIterator<Type> it = (list.listIterator(list.size()));
Что мы делаем, это взять наш список, а затем позвонив listIterator()
в этом списке, проходя list.size()
в качестве аргумента. Затем метод возвращает ListIterator, который назначен it
,
РЕДАКТИРОВАТЬ:
Я не совсем уверен, понял ли я твой вопрос прямо перед этим. В этом случае не ArrayList должен реализовывать интерфейс ListIterator, а объект, который возвращается listIterator(int)
метод, который вы вызываете для экземпляра ArrayList, поэтому только объект, возвращаемый вызовом этого метода, должен реализовывать интерфейс.