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