假设我有以下界面和类:
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})}
中描述的灵魂感兴趣
答案 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)