Ответ 1
Вы можете выполнить прокрутку через интерфейс нетипизированного списка:
List<A> a = new ArrayList<A>();
List<B> b = (List)a;
Предположим, что класс B
расширяет класс A
. У меня есть List<A>
, который, как мне кажется, содержит только экземпляры B
. Есть ли способ, которым я могу применить List<A>
к List<B>
?
Кажется, мой единственный вариант - перебирать коллекцию, накладывая один элемент на время, создавая новую коллекцию. Это похоже на полную потерю ресурсов, которые при стирании данного типа делают это совершенно ненужным во время выполнения.
Вы можете выполнить прокрутку через интерфейс нетипизированного списка:
List<A> a = new ArrayList<A>();
List<B> b = (List)a;
Вы можете попробовать следующее:
List<A> a = new ArrayList<A>();
List<B> b = (List<B>) (List<?>) a;
Он основан на ответе jarnbjo, но не использует исходные списки.
List<A>
не является подтипом List<B>
!
Подтипирование не распространяется на общие типы:
T <: U
не означает, чтоC<T> <: C<U>
.
Способ сохранения безопасности определенного типа с минимальным воздействием на производительность заключается в использовании обертки. Этот пример касается Collection, случай List будет очень похожим, и, возможно, однажды я тоже напишу. Если кто-то еще передо мной, сообщите, пожалуйста, общий код.