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
的唯一途径
尝试使用mutableListOf
或arrayListOf
。
不,就集合而言,你无法避免 java API,因为每个 kotlin 集合都以某种方式使用相应的 java 集合。
Kotlin 集合接口只是模拟接口,它们在运行时并不真正存在。因此,即使你有一个 class 在运行时实现一些 kotlin 集合接口(例如 MutableList
),它也会使用相应的 java 接口。
例如让我们编写两个 kotlin classes 分别实现 kotlin 的 List
和 MutableList
接口
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.KMappedMarker
和 kotlin.jvm.internal.markers.KMutableList
接口,所以你可以看到 kotlin 接口已经消失了,我们留下相同的旧 java List
并且您的方法调用现在将是地址 java.util.List.someMethod 而不是某些 kotlin 接口。 KMutableList
和 KMappedMarker
顾名思义是编译器使用的 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 集合的基础。
MutableList
是一个 接口 ,但我在 kotlin
中找不到 class显式实现它的包。有没有?此外,我本来希望是一个包范围定义 mutableListOf(varargs) 与 listOf(varargs) 对称。到目前为止,我必须使用 java 个集合。
你是对的,java collections 是获得 MutableList
尝试使用mutableListOf
或arrayListOf
。
不,就集合而言,你无法避免 java API,因为每个 kotlin 集合都以某种方式使用相应的 java 集合。
Kotlin 集合接口只是模拟接口,它们在运行时并不真正存在。因此,即使你有一个 class 在运行时实现一些 kotlin 集合接口(例如 MutableList
),它也会使用相应的 java 接口。
例如让我们编写两个 kotlin classes 分别实现 kotlin 的 List
和 MutableList
接口
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.KMappedMarker
和 kotlin.jvm.internal.markers.KMutableList
接口,所以你可以看到 kotlin 接口已经消失了,我们留下相同的旧 java List
并且您的方法调用现在将是地址 java.util.List.someMethod 而不是某些 kotlin 接口。 KMutableList
和 KMappedMarker
顾名思义是编译器使用的 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 集合的基础。