Вопрос

На этот вопрос уже есть ответ здесь:

Предположим, класс 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>.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top