将子类型列表添加到Kotlin中的超类型列表

时间:2017-07-02 08:36:51

标签: 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})}

但我对the article about variance in Kotlin

中描述的灵魂感兴趣

2 个答案:

答案 0 :(得分:6)

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

如果您确定attachableList仅包含Image类型的实例,则使用it as Image即可(尽管还有.filterIsInstance<Image>()。我我没有看到使用方差特征的方法。

答案 1 :(得分:3)

如果您确定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)
相关问题