首页 > 解决方案 > listOf() 返回 MutableList

问题描述

在 Kotlin 中,使用该listOf()函数创建的列表(应该是不可变的)MutableList通过使用运算符的类型检查is

例子:

fun main(args: Array<String>) {
    val list = listOf("I'm immutable")

    println(list is MutableList)
}

将打印

真的

有趣的是,使用创建的空列表listOf<String>()将无法通过检查并在返回单例对象时打印falseEmptyList

经过一番挖掘,结果是mutableListOf()创建了java.util.ArrayListwhilelistOf()最终创建了 a java.util.Arrays$ArrayList,但所涉及的类都没有实现MutableList,那么为什么非空列表仍然通过类型检查呢?因此,是否有另一种方法可以可靠地检查列表是否可变,而无需检查它的实际实现(is ArrayList等)?

标签: javakotlin

解决方案


List和之间的分离MutableList是 Kotlin 编译器制造的一种错觉。在运行时,Kotlin 使用 Java 集合类,它只有一个List包含读取和变异方法的接口。编译时引用ListMutableList都编译为java.util.List引用。因此,无法MutableList在运行时检测列表是否为 a。


推荐阅读