Intereting Posts
Переменная вида Kotlin неожиданно null в методе Activity onCreate Странное поведение compose и ObservableTransformer в RxJava, когда переданный родословный расширяет что-то Элементы представления Android NavigationView Headerlayout не запускают события щелчка Каков правильный способ создания нового экземпляра родового класса в котлин? Hibernate OneToMany неверное связывание с родителями Kotlin – как передать нулевое значение в фрагменты метода newInstance? только один сопутствующий объект разрешен для каждого класса в Котлине Приложение build.gradle.kts Файл Unresolved Reference Erros Как настроить Jacoco со Spek в мультипроекте? kotlin: некоторые проблемы с массивами в аннотациях Какой смысл деструктурировать объявления в Котлине? Неразрешенная ссылка: SpringExtension с использованием @ExtendWith аннотации Как изменить цвет положительной кнопки на alertdialog? Ошибка прокси-сервера REST клиента Kotlin Как получить идентификатор документа для документа Firestore с использованием классов данных kotlin

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

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

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)