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

use*_*587 1 java list arraylist kotlin

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

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

据我了解,List 和 MutableList 只是 ArrayList 的两个不同“视图”,不可变和可变。为什么它们映射到看似不同的 ArrayList 类,作为并列接口,是什么定义了 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 
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 7

为什么它们映射到看似不同的 ArrayList 类,作为并列接口?

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

listOf返回一个能够完成List接口中列出的所有事情的对象。这就是声明一个函数“返回一个List”的含义。同样,mutableListOf返回一个能够完成MutableList接口中列出的所有事情的对象。

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

无论如何,java.util.Arrays$ArrayList是一个不可变的列表。它是java.util.Arrays. 当您这样做时Arrays.asList,您通常会在 Java 中看到这个类,它的用途与 类似listOf,但同样,这是一个实现细节。另一方面,java.util.ArrayList是可变的。

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