java.util.LinkedList() 如何成为 MutableList 的实例?

boo*_*lan 1 java linked-list kotlin mapped-types mutablelist

下面的代码如何编译才不会出现错误?

var linkedList: MutableList<Int> = java.util.LinkedList()
Run Code Online (Sandbox Code Playgroud)

java.util.LinkedList类契约显然没有实现 Kotlin 接口时MutableList

Jos*_*osh 5

在您的示例中,编译器没有推断任何内容。告诉编译器您的linkedList变量将被视为MutableList<Int>. 编译器允许这样做,因为java.util.LinkedList它是 Java 接口的实现List,它映射到 KotlinListMutableList接口。

根据Tenfour04 提供的文档List<T>, java 中的 a 是映射到 Kotlin 的映射类型List<T>,或者MutableList<T>- 选择权取决于您。

请注意,这里使用的是“类型”一词,而不是“类”。您所做的只是告诉编译器您希望将此变量视为MutableList<Int>- 就是这样。文档中的这句话强化了这个想法:

映射仅在编译时重要,运行时表示保持不变。

因此,通过将变量声明为可变或其他变量,您只需使用 Kotlin 映射类型屏蔽底层类 (java.util.LinkedLink)。

我们已经知道java.util.LinkedList默认情况下它是可变的。所以做这些

val immutableLinkedList: List<Int> = java.util.LinkedList<Int>()
val mutableLinkedList: MutableList<Int> = java.util.LinkedList<Int>()
Run Code Online (Sandbox Code Playgroud)

是完全有效的。在前一种情况下,由于您已经通知编译器这immutableLinkedList只是类型List<Int>(请记住 - 您只能这样做,因为此 Kotlin 类型映射到 的父类型LinkedList),那么您将无法添加或删除它,即使实际的运行时实现在技术上允许

这些机制旨在帮助保持类型安全并明确您正在使用的结构类型。如果您使用 Kotlin 工作,最好您的 linkedList 注释为 kotlin 类型MutableList,因为很明显该列表实际上是可变的。

另一方面,您可以想象列表的实现实际上很重要的某些情况,因此您可以选择完全删除类型注释并让编译器将其视为java.util.LinkedList.

val myLinkedList = java.util.LinkedList<Int>()