Intereting Posts
Подстановочные знаки в Котлине для переменных Kotlin – Как добавить OnPageChangeListener в ViewPager @Throws не влияет, когда цель является свойством Общая функция с общим двумерным массивом Kotlin – Как «запоздать» var переопределил интерфейс? Как контролировать, когда импорт заменяется шаблоном в Android Studio в файлах Kotlin Что означает «. ()» В Котлине? Использование объекта Kotlin в классе, сгенерированном во время выполнения Не удается сохранить модель данных, содержащую Список <Модель> с комнатой ORM Kotlin как настроить регистратор логов Подкласс класса закрытого класса Kotlin должен быть отлит в базовый класс, если он представлен как RxJava Observable Ошибка при использовании объекта для реализации пустого списка Как заставить Джексона использовать параметры по умолчанию для Kotlin для отсутствующих значений? Функция расширения Kotlin доступа к частному полю Java Дженкинс град строит неудачу из-за приложения: compileDebugKotlin

Добавление списка подтипов в список супертипов в Котлине

Допустим, у меня есть интерфейс и класс:

interface Attachable class Image: Attachable 

и следующий список:

 val attachableList = listOf<Attachable>(Image(),Image(),Image()) 

В этом случае, как добавить список прикрепленных файлов в список изображений?

 var imageList = arrayListOf<Image>().addAll(attachableList) // Error: Type mismatch. Required: Collection<Image>, Found: List<Attachable> 

Очевидная душа состоит в том, чтобы явно отобразить это:

 val imageList = arrayListOf<Image>().apply{addAll(attachableList.map{it as Image})} 

Но меня интересует душа, описанная в статье о разнице в Котлине

Solutions Collecting From Web of "Добавление списка подтипов в список супертипов в Котлине"

Проблема в том, что imageList может содержать только экземпляры типа Image . Однако attachableList содержит экземпляры типа Attachable . Поскольку другие классы, кроме Image могут реализовать Attachable , вы не можете безопасно добавлять все элементы из imageList в imageList .

Если вы уверены, что attachableList содержит только экземпляры типа Image , используя it as Image в порядке (хотя есть также .filterIsInstance<Image>() . Я не вижу способа обойти это с помощью функций дисперсии.

Вы можете просто сказать imageList.addAll(attachableList as List<Image>) если вы уверены, что attachableList будет содержать только изображения.

Вы получите предупреждение без предупреждения, но не ошибку компилятора.

 val attachableList: List<Attachable> = listOf(Image(), Image()) var imageList = arrayListOf<Image>() imageList.addAll(attachableList as List<Image>) println(attachableList) println(imageList) println(imageList == attachableList)