Что происходит при создании ListIterator? - PullRequest
0 голосов
/ 26 августа 2011

У меня было два класса: ParentClass и SubClass.Подкласс наследует от ParentClass.У меня был следующий код: (внутри класса)

List<SubClass> lstSub;

//some initialization

public ListIterator getLstIterator(int i) {
   return lstSub.listIterator(i);
}

И клиентский класс использует его следующим образом:

ListIterator<ParentClass> lstParent = getLstIterator(0); //assign ListIterators

Итак, вопрос: что делает программа при назначении ListIterators:

1) он создает новый список и копирует туда элементы из списка источников, приводя их к ParentClass;

2) он просто создает ссылку на lstSub, и с этого времени этот список интерпретируетсякак List для ListIterator?

Или это что-то еще?Я заинтересован в этом из-за производительности программы.Я новичок в Java и ценю любую помощь.

Ответы [ 3 ]

1 голос
/ 27 августа 2011

Это не создает другой список.Если вы получите итератор списка, не зная класса в списке, это будет ошибкой при использовании вами обобщенных элементов.Вы должны получить предупреждение при выполнении этого задания, но это всего лишь предупреждение.Когда вы на самом деле используете его, он будет приведен к любому классу.Правильно было бы придерживаться этого как ListIterator<? extends ParentClass>, если бы вы хотели итератор списка, но на самом деле держаться за итератор немного странно.

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

1 голос
/ 27 августа 2011

С точки зрения производительности, копирование списка не происходит.

Но чтобы компилятор проверил безопасность типов кода, вы должны объявить параметры типа следующим образом:

public ListIterator<SubClass> getLstIterator(int i) {
  return lstSub.listIterator(i);
}

...

ListIterator<? extends ParentClass> lstParent = getLstIterator(0);
1 голос
/ 27 августа 2011

Создан новый экземпляр ListIterator . Ссылка на новый объект копируется в lstParent

См. здесь

     public ListIterator<E> listIterator(int index) {
        if (index < 0 || index > size)
             throw new IndexOutOfBoundsException("Index: "+index);
         return new ListItr(index);
     }

Отказ от ответственности: этот пример относится только к ArrayList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...