2017-07-02 42 views
1

列出超类型的比方说,我有以下接口和类:添加亚型的名单在科特林

interface Attachable 
class Image: Attachable 

和下面的列表:

val attachableList = listOf<Attachable>(Image(),Image(),Image()) 

在这种情况下,我怎么可以添加attachables名单到图像列表?

var imageList = arrayListOf<Image>().addAll(attachableList) 
// Error: Type mismatch. Required: Collection<Image>, Found: List<Attachable> 

明显soultion是显式地映射它像:

val imageList = arrayListOf<Image>().apply{addAll(attachableList.map{it as Image})} 

但我感兴趣的是在the article about variance in Kotlin

回答

6

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

如果您确信attachableList只包含Image类型的实例,使用it as Image是罚款(虽然有也.filterIsInstance<Image>(),我不使用方差的特征看的方式解决这个问题。

+0

你应该关注'filterIsInstance'并且很快解释。它看起来是最好的和正确的方式来做到这一点。 – tynn

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)