将子类型列表添加到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})} 

但是我对Kotlin中有关变异的文章中所描述的灵魂感兴趣

问题是imageList可能只包含Image类型的实例。 但是, attachableList包含“ attachableList ”类型的实例。 由于除Image之外的其他类可能会实现Attachable ,因此无法安全地将所有元素从imageList添加到imageList

如果你确定attachableList只包含Image类型的实例,那么将it as Image也是可以的(虽然也有.filterIsInstance<Image>() 。但是我没有看到使用方差特性的方法。

如果你确定attachableList将只包含图像,你可以只说imageList.addAll(attachableList as List<Image>)

您将收到一个未经检查的转换警告,但没有编译器错误。

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