在 Kotlin 中,使用
listOf()
函数创建的列表(应该是不可变的)可以使用 is
运算符通过类型检查来检查是否为 MutableList
。
示例:
fun main(args: Array<String>) {
val list = listOf("I'm immutable")
println(list is MutableList)
}
将打印
true
有趣的是,使用 listOf<String>()
创建的空列表将失败并打印false,因为它返回单例对象 EmptyList
。
经过一番挖掘,发现 mutableListOf()
创建了一个 java.util.ArrayList
,而 listOf()
最终创建了一个 java.util.Arrays$ArrayList
,但是涉及的所有类都没有实现 MutableList
,那么为什么非空列表仍然可以通过类型检查?因此,有没有一种可靠的方法来检查列表是否可变,而无需对其实际实现进行检查(例如 is ArrayList
等)?
java.util.Arrays$ArrayList
实际上是可变的,因为您可以替换元素。它只是大小固定,因此您无法添加或删除元素。我认为Kotlin必须有一些内部映射或方法来查找Java列表是否具有“可变”属性。Java中不存在MutableList
接口,这必须是Kotlin特有的。 - MadjoszlistOf
返回一个 SingletonList。为什么is
在这里返回true
是一个好问题。 - Zoe stands with Ukrainelist::class.java == MutableList::class.java
的输出结果为 false。这两个类并不相同,因此我猜测is
运算符或其编译的某些代码存在错误。看起来is
运算符使用TypeIntrinsics.isMutableList(list);
来检查类型。 - Zoe stands with UkraineMutableList
和List
之间的运行时区别。只有在编译时才有区别。 - Louis Wasserman