这是我为了理解Kotlin 语言而刻意举的一个例子.
下面的类Box<T>
对包含相同类型T的框的框进行建模.
问题是为什么arr += x
会导致编译错误,而arr.add(x)
不会.
错误消息为:
类型不匹配.必需:kotlin.collections.ArrayList Box>
找到:List<;Box>;
属性arr
是不可变的并且指向可变列表.因此,我相信arr += x
应该是arr = arr + x
还是arr.add(x)
是没有歧义的.应该是arr.add(x)
的意思
我还注意到,如果泛型类型Box
实现Iterable<T>
而不是Iterable<Box<T>>
,这个问题就解决了
那么,错误的原因是什么呢?
class Box<T>(private val arr: ArrayList<Box<T>> = ArrayList()) : Iterable<Box<T>> {
private val id: Int = seq++
override operator fun iterator(): Iterator<Box<T>> {
return object : Iterator<Box<T>> {
private var i = 0;
override fun hasNext(): Boolean {
return i < arr.size
}
override fun next(): Box<T> {
return arr[i++]
}
}
}
fun add(x: Box<T>) {
// arr.add(x) // OK
arr += x // Error: Type mismatch.
}
companion object {
var seq: Int = 0
}
override fun toString(): String {
return "Box[$id]"
}
}
fun main() {
val box = Box<Int>(arrayListOf(Box(), Box()))
for (x in box) {
println(x)
}
}