在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文档中找不到关于后者的任何信息。这个问题源于此代码在控制台中输出的内容:
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 发布于 2020-11-16 06:39:07
为什么要映射到看似不同的ArrayList类,当它们是并置接口时?
接口不“映射到”类。接口指定一组需求。如果一个类实现了一个接口,它意味着它满足了该接口中指定的所有需求。
listOf返回一个能够执行List接口中列出的所有事情的对象。这就是声明一个函数以“返回一个List”的意思,类似地,mutableListOf返回一个能够执行MutableList接口中列出的所有事情的对象。
方法返回哪种特定类型的对象并不重要,只要它们能够执行接口中指定的事情。它们返回的特定类型,即listOf(...)::class和mutableListOf()::class是实现细节。因为它们是实现细节,所以您不应该将其视为“绝对真理”,而应该说"listOf返回一个java.util.Arrays$ArrayList“之类的话。事实上,事实并非如此。在撰写本报告时,listOf<Integer>()::class是class 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。
发布于 2020-11-16 06:37:22
java.util.Arrays$ArrayList是Arrays类中的一个嵌套类。java.util.Arrays$ArrayList和java.util.ArrayList的主要区别是前者有固定的长度,而后者的长度可以增长。这两个列表都由数组支持。
java.util.Arrays$ArrayList也将是Arrays.asList的返回类型,用于从数组中创建不可变列表。
这就是为什么MutableList从java.util.ArrayList继承而List从java.util.Arrays$ArrayList继承的原因,因为它是不可变的。
https://stackoverflow.com/questions/64853452
复制相似问题