在Kotlin中,使用listOf()
函数(which should be immutable)创建的列表使用MutableList
运算符对is
进行了类型检查。
示例:
fun main(args: Array<String>) {
val list = listOf("I'm immutable")
println(list is MutableList)
}
将打印
true
有趣的是,使用listOf<String>()
创建的空列表将失败,并在返回单例对象EmptyList
时显示 false 。
经过一番挖掘,结果发现mutableListOf()
创建了一个java.util.ArrayList
,而listOf()
最终创建了一个java.util.Arrays$ArrayList
,但是涉及的所有类都没有实现{{1} },为什么非空列表仍通过类型检查呢?因此,是否有另一种方法可以可靠地检查列表是否可变,而不必检查列表的实际实现(MutableList
等)?
答案 0 :(得分:8)
List
和MutableList
之间的分隔是Kotlin编译器造成的一种幻觉。在运行时,Kotlin使用Java集合类,它们只有一个包含读取和变异方法的List
接口。对List
和MutableList
的编译时引用都被编译为java.util.List
引用。因此,在运行时无法检测列表是否为MutableList
。