在 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(...)::class
和 mutableListOf()::class
是实现细节。因为它们是实现细节,所以您不应该将其视为“绝对真理”并说“listOf
返回 java.util.Arrays$ArrayList
”之类的话。事实上,它没有。在撰写本文时,listOf<Integer>()::class
是class 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/