У меня было два класса: 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 ответа
Другого списка он не создает. Если вы получаете итератор списка, не зная класса в списке, это будет ошибкой при использовании ваших универсальных шаблонов. При выполнении этого задания вы должны получить предупреждение, но это всего лишь предупреждение. Когда вы его действительно используете, он будет приведен к любому классу. Правильно, если вам нужен итератор списка, вы бы держали его как ListIterator<? extends ParentClass>
, но на самом деле удерживать итератор немного странно.
Наконец, небольшой совет, я бы не слишком беспокоился о производительности языковых функций, особенно если вы только начинаете изучать язык.
Новый экземпляр ListIterator создан. Ссылка на новый объект копируется в lstParent
См. здесь
public ListIterator<E> listIterator(int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
Отказ от ответственности: этот пример относится к ArrayList.
С точки зрения производительности, копирования списка не происходит.
Но чтобы компилятор проверил типобезопасность кода, вы должны объявить параметры типа следующим образом:
public ListIterator<SubClass> getLstIterator(int i) {
return lstSub.listIterator(i);
}
...
ListIterator<? extends ParentClass> lstParent = getLstIterator(0);
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].