Kotlin 中是否有可实例化的 MutableList,避免 java api?

Is there an instanciable MutableList in Kotlin, avoiding java api?

MutableList 是一个 接口 ,但我在 kotlin 中找不到 class显式实现它的包。有没有?此外,我本来希望是一个包范围定义 mutableListOf(varargs)listOf(varargs) 对称。到目前为止,我必须使用 java 个集合。

你是对的,java collections 是获得 MutableList

的唯一途径

尝试使用mutableListOfarrayListOf

不,就集合而言,你无法避免 java API,因为每个 kotlin 集合都以某种方式使用相应的 java 集合。

Kotlin 集合接口只是模拟接口,它们在运行时并不真正存在。因此,即使你有一个 class 在运行时实现一些 kotlin 集合接口(例如 MutableList),它也会使用相应的 java 接口。

例如让我们编写两个 kotlin classes 分别实现 kotlin 的 ListMutableList 接口

abstract class KotlinList : List<Int>

abstract class KotlinMutableList : MutableList<Int>

当您反编译这些 classes 时,它们的签名更改如下(注意,前面的字节代码)

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

现在 classes 都实现了 java.util.List 接口,它们还分别实现了 kotlin.jvm.internal.markers.KMappedMarkerkotlin.jvm.internal.markers.KMutableList 接口,所以你可以看到 kotlin 接口已经消失了,我们留下相同的旧 java List 并且您的方法调用现在将是地址 java.util.List.someMethod 而不是某些 kotlin 接口。 KMutableListKMappedMarker 顾名思义是编译器使用的 marker 接口。

KotlinList class 的情况下,如果你往里面看,你会看到 java.util.List 的所有 mutater 方法都是为你生成的,看起来类似于下面的那个

   public boolean add(int var1) {
      throw new UnsupportedOperationException("Operation is not supported for read-only collection");
   }

因此,正如您所见,无法避免 java API,因为它们是 kotlin 集合的基础。