У меня было два класса: 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 и ценю любую помощь.

0
Deepscorn 26 Авг 2011 в 23:58

3 ответа

Лучший ответ

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

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

1
Micah Hainline 26 Авг 2011 в 20:07

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

См. здесь

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

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

1
Tom 26 Авг 2011 в 20:12

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

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

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

...

ListIterator<? extends ParentClass> lstParent = getLstIterator(0);
1
Jordão 26 Авг 2011 в 20:19