【发布时间】:2015-04-26 20:41:19
【问题描述】:
MutableList 是一个接口,但我在kotlin 包中找不到明确实现它的类。有没有?此外,我本来希望是一个与 listOf(varargs) 对称地定义的包范围 mutableListOf(varargs)。到目前为止,我必须使用 java Collections。
【问题讨论】:
标签: kotlin
MutableList 是一个接口,但我在kotlin 包中找不到明确实现它的类。有没有?此外,我本来希望是一个与 listOf(varargs) 对称地定义的包范围 mutableListOf(varargs)。到目前为止,我必须使用 java Collections。
【问题讨论】:
标签: kotlin
尝试使用mutableListOf 或arrayListOf。
【讨论】:
List 和 Mutable 列表有点 Kotlin 的魔力。所有 Java List 实现都是 Kotlin List 和 MutableList,包括 ArrayList 和 LinkedList 以及其他自定义实现。 Kotlin 具有帮助函数,可以更轻松地创建列表,如本答案所示。 listOf 等其他助手返回只读列表接口List,而不是可变接口。答案中的返回MutableLis 接口。
linkedListOf 在 1.0 之前消失了。有更通用的mutableListOf 代替。
你说得对,java集合是获取MutableList的唯一途径
【讨论】:
不,就集合而言,您无法避免使用 java API,因为每个 kotlin 集合都以一种或另一种方式使用相应的 java 集合。
Kotlin 集合接口只是模拟接口,它们在运行时并不真正存在。所以即使你有一个类在运行时实现了一些 kotlin 集合接口(例如MutableList),它也会使用相应的 java 接口。
例如让我们编写两个 kotlin 类分别实现 kotlin 的 List 和 MutableList 接口
abstract class KotlinList : List<Int>
abstract class KotlinMutableList : MutableList<Int>
当你反编译这些类时,它们的签名变化如下(抬头,字节码在前)
public abstract class com/example/kotlin/KotlinList implements java/util/List kotlin/jvm/internal/markers/KMappedMarker
public abstract class com/example/kotlin/KotlinMutableList implements java/util/List kotlin/jvm/internal/markers/KMutableList
现在这两个类都实现了java.util.List 接口,它们也分别实现了kotlin.jvm.internal.markers.KMappedMarker 和kotlin.jvm.internal.markers.KMutableList 接口,所以你可以看到kotlin 接口已经消失,我们只剩下相同的旧java List 和你的方法调用现在将作为 java.util.List.someMethod 的地址,而不是一些 kotlin 接口。 KMutableList 和KMappedMarker 顾名思义是编译器使用的marker 接口。
如果是KotlinList 类,如果您查看内部,您会看到为您生成了java.util.List 的所有变异方法,看起来类似于下面的一个
public boolean add(int var1) {
throw new UnsupportedOperationException("Operation is not supported for read-only collection");
}
如您所见,Java API 是无法避免的,因为它们是 kotlin 集合的基础。
【讨论】: