Подтвердить что ты не робот

Java: тип коллекции для подтипа

Предположим, что класс B расширяет класс A. У меня есть List<A>, который, как мне кажется, содержит только экземпляры B. Есть ли способ, которым я могу применить List<A> к List<B>?

Кажется, мой единственный вариант - перебирать коллекцию, накладывая один элемент на время, создавая новую коллекцию. Это похоже на полную потерю ресурсов, которые при стирании данного типа делают это совершенно ненужным во время выполнения.

4b9b3361

Ответ 1

Вы можете выполнить прокрутку через интерфейс нетипизированного списка:

List<A> a = new ArrayList<A>();
List<B> b = (List)a;

Ответ 2

Вы можете попробовать следующее:

List<A> a = new ArrayList<A>();
List<B> b = (List<B>) (List<?>) a;

Он основан на ответе jarnbjo, но не использует исходные списки.

Ответ 3

List<A> не является подтипом List<B>!

JLS даже упоминает это явно:

Подтипирование не распространяется на общие типы: T <: U не означает, что C<T> <: C<U>.

Ответ 4

Способ сохранения безопасности определенного типа с минимальным воздействием на производительность заключается в использовании обертки. Этот пример касается Collection, случай List будет очень похожим, и, возможно, однажды я тоже напишу. Если кто-то еще передо мной, сообщите, пожалуйста, общий код.