Джава:привести тип коллекции к подтипу
-
22-07-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
Предположим, класс B
расширяет класс A
.у меня есть List<A>
что я случайно знаю только содержит экземпляры B
.Есть ли способ, которым я могу использовать List<A>
к List<B>
?
Кажется, мой единственный вариант — перебирать коллекцию, приводя по одному элементу за раз и создавая новую коллекцию.Это кажется пустой тратой ресурсов, поскольку стирание типа делает это совершенно ненужным во время выполнения.
Решение
Вы можете использовать нетипизированный интерфейс List:
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>
!
JLS даже упоминает об этом прямо:
Подтипирование не распространяется на общие типы:
T <: U
не подразумевает, чтоC<T> <: C<U>
.
Способ сохранить некоторую типобезопасность с минимальным влиянием на производительность — использовать обертка.Этот пример посвящен коллекции, случай списка будет очень похож, и, возможно, однажды я тоже это напишу.Если кто-то придет раньше меня, поделитесь кодом.