Intereting Posts
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: ожидается BEGIN_ARRAY, но был STRING в строке 1 столбца 2 пути Котлин «не ожидал никаких параметров» при попытке вернуть встроенную лямбду Котлин || Не удалось добавить библиотеку в Мое приложение? время подключения: подключиться к журналу IDE Можете ли вы отобразить / свести строку в Int? Есть ли лучший способ написать это в котлин? Идиоматический способ обращения с нулевым или пустым списком в Котлин Котлин: проблемы с пониманием дженериков Kotlin-js: Определить число десятичных знаков Блок Try-Catch недоступен? Имеет ли внутренний блок try-finally внешний блок try-catch недоступен? Нулевая проверка, если условия Измените только один метод класса из java в kotlin Реализация SQLite в Котлине и Анко Dagger 2 обменивается экземпляром объекта между ведущими Рекурсивный вызов по ленивому значению с использованием LiveData и ObserveForever

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

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

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)