首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Kotlin中,为什么mutableListOf返回java.util.ArrayList的实例,而listOf返回java.util.Arrays$ArrayList的实例?

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

Stack Overflow用户
提问于 2020-11-16 06:18:57
回答 2查看 421关注 0票数 2

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

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

据我所知,List和MutableList只是ArrayList的两个不同的“视图”,不可变和可变。为什么他们映射到看似不同的ArrayList类时,作为并列接口,是什么定义了ArrayList在Kotlin中的行为和使用?

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

代码语言:javascript
复制
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 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-16 06:39:07

为什么要映射到看似不同的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本来可以设计为返回一个ArrayList (这很好),而且它的可变性质可能隐藏在不可变的List接口( ArrayList也实现了)之后,但可以推测返回Arrays$ArrayList更好,因为它没有创建传递给listOf的数组的副本。2)实现了List

票数 8
EN

Stack Overflow用户

发布于 2020-11-16 06:37:22

java.util.Arrays$ArrayListArrays类中的一个嵌套类。java.util.Arrays$ArrayListjava.util.ArrayList的主要区别是前者有固定的长度,而后者的长度可以增长。这两个列表都由数组支持。

java.util.Arrays$ArrayList也将是Arrays.asList的返回类型,用于从数组中创建不可变列表。

这就是为什么MutableListjava.util.ArrayList继承而Listjava.util.Arrays$ArrayList继承的原因,因为它是不可变的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64853452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档