【问题标题】:Is there an instanciable MutableList in Kotlin, avoiding java api?Kotlin 中是否有一个可实例化的 MutableList,避免使用 java api?
【发布时间】:2015-04-26 20:41:19
【问题描述】:

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

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    尝试使用mutableListOfarrayListOf

    【讨论】:

    • 如果这个被接受的答案能再解释一下就好了。 ListMutable 列表有点 Kotlin 的魔力。所有 Java List 实现都是 Kotlin ListMutableList,包括 ArrayListLinkedList 以及其他自定义实现。 Kotlin 具有帮助函数,可以更轻松地创建列表,如本答案所示。 listOf 等其他助手返回只读列表接口List,而不是可变接口。答案中的返回MutableLis 接口。
    • linkedListOf 在 1.0 之前消失了。有更通用的mutableListOf 代替。
    • 它们只是快捷方式,mutableListOf 只是返回一个 ArrayList(它是可变的); listOf 是调用 Arrays.asList 的替代方法(它是不可变的)
    【解决方案2】:

    你说得对,java集合是获取MutableList的唯一途径

    【讨论】:

      【解决方案3】:

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

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

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

      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.KMappedMarkerkotlin.jvm.internal.markers.KMutableList 接口,所以你可以看到kotlin 接口已经消失,我们只剩下相同的旧java List 和你的方法调用现在将作为 java.util.List.someMethod 的地址,而不是一些 kotlin 接口。 KMutableListKMappedMarker 顾名思义是编译器使用的marker 接口。

      如果是KotlinList 类,如果您查看内部,您会看到为您生成了java.util.List 的所有变异方法,看起来类似于下面的一个

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多