java - 在 Kotlin 中,为什么 mutableListOf 返回一个 java.util.ArrayList 的实例,而 listOf 返回一个 java.util.Arrays$ArrayList 的实例?

标签 java list kotlin arraylist

在 Kotlin 中,mutableListOf 方法返回一个实现了 Kotlin 的 MutableList 接口(interface)的 java.util.ArrayList 实例。

现在,listOf 方法返回一个实现了 Kotlin 的 List 接口(interface)的 java.util.Arrays$ArrayList 实例。

据我了解,List 和 MutableList 只是 ArrayList 的两个不同“ View ”,不可变和可变。为什么它们映射到看似不同的 ArrayList 类,而实际上它们作为并列接口(interface)定义了 Kotlin 中 ArrayList 的行为和用途?

java.util.ArrayList 和 java.util.Arrays$ArrayList 有什么区别?我在 java 文档中找不到关于后者的任何信息。这个问题源于此代码在控制台中输出的内容:

val list = listOf(1, 2, 3)
val mutableList = mutableListOf(1, 2, 3)

println( list.javaClass )           // class java.util.Arrays$ArrayList 
println( mutableList.javaClass )    // class java.util.ArrayList 

最佳答案

Why do they map to seemingly different ArrayList classes when they are, as juxtaposing interfaces?

接口(interface)不“映射到”类。接口(interface)指定了一组要求。如果一个类实现了一个接口(interface),则意味着它满足该接口(interface)中指定的所有要求

listOf返回一个能够执行 List 中列出的所有事情的对象界面。这就是将函数声明为“返回 List”的含义。类似地,mutableListOf返回一个能够执行 MutableList 中列出的所有事情的对象界面。

方法返回哪种特定类型的对象并不重要,只要它们能够执行接口(interface)中指定的操作即可。他们返回哪种特定类型,即 listOf(...)::classmutableListOf()::class实现细节。因为它们是实现细节,所以您不应该将其视为“绝对真理”并说“listOf 返回 java.util.Arrays$ArrayList ”之类的话。事实上,它没有。在撰写本文时,listOf<Integer>()::classclass kotlin.collections.EmptyList .

无论如何,java.util.Arrays$ArrayList是一个不可变列表。这是java.util.Arrays中的私有(private)内部类.当您执行 Arrays.asList 时,您通常会在 Java 中看到此类。 ,其用途与 listOf 类似,但同样,这是一个实现细节。另一方面,java.util.ArrayList是可变的。

虽然listOf可能被设计为返回 ArrayList (这完全没问题),它的可变性质可以隐藏在不可变的 List 后面。接口(interface)(ArrayList 也实现),可以推测返回一个 Arrays$ArrayList更可取,因为 1) 它不会创建您传递给 listOf 的数组的副本. 2) 它确实实现了List .

关于java - 在 Kotlin 中,为什么 mutableListOf 返回一个 java.util.ArrayList 的实例,而 listOf 返回一个 java.util.Arrays$ArrayList 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64853452/

相关文章:

python - 将 2D 列表转换为字典,其中重复值转换为键,其余值转换为列表

android - 在 Jetpack Compose 中为自定义手势添加波纹效果

kotlin - 如何从调用对象获取IP地址

java - 在groovy中重写java方法时出现问题

java - 尝试使用部署在 WebSphere 中的 Java REST Web 服务。我收到 SSLHandshakeException

java - 如何确认消息传送到 Amazon SQS 队列?

java - 如何获取 Javascript 实现的接口(interface)的哈希码

bash - 如何在bash中将列表转换为字符串?

python - 为什么在 Python 中使用 [e] * n(用于创建单个项目重复 n 次的列表)速度很快?

kotlin - Box 不捕获 Compose Desktop 中的关键事件