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

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

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)