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?
在您的示例中,编译器没有推断任何内容。您告诉编译器您的linkedList变量将被视为MutableList<Int>. 编译器允许这样做,因为java.util.LinkedList它是 Java 接口的实现List,它映射到 KotlinList或MutableList接口。
根据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>()
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |