kotlin中的addAll


#1

MutableList可以进行AddAll,override fun addAll(elements: Collection<E>): Boolean
我有一个方法

 val list : MutableList<OldItem>
fun test(list : List<OldItem?> ?) {
this.list.clear()
this.list.addAll(list)
} 

在addAll这行报错Type mismatch, 是不应该这么写吗


#2

fun test(list : List<OldItem?>?) 改成 fun test(list : List<OldItem>) 就可以了,
但是为什么, ?是为空不执行,这种addAll的类型有什么关系?


#3

OldItem is a OldItem?
但是 OldItem? is not a OldItem
可以把OldItem? 理解成是 OldItem 的超类


#4

因为
MutableList<OldItem>
List<OldItem?> ?
类型一个为空一个不为空,所以会出现类型不一致问题。


#5

mutableList的实现类是ArrayList,在ArrayList的addAll的源码是
override fun addAll(elements: Collection): Boolean.可以看到elements默认是不为空的,这里解释了addall(list)的list不能为空的原因.所以添加可空类型编译器会报错,再看ArrayList的声明是
expect class ArrayList : MutableList, RandomAccess {
override fun addAll(elements: Collection): Boolean
}
elements的泛型类型必须和类的泛型声明一致,所以 fun test(list : List<OldItem?>?)的list类型必须是List,或者声明
val list : MutableList<OldItem?>.


京ICP备16022265号-2 Kotlin China 2017 - 2018