Когда 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, поэтому только объект, возвращаемый вызовом этого метода, должен реализовывать интерфейс.

Другие вопросы по тегам