以下代码如何编译而没有任何错误?
var linkedList: MutableList<Int> = java.util.LinkedList()
当java.util.LinkedList
类契约显然没有实现Kotlin接口MutableList
时?
以下代码如何编译而没有任何错误?
var linkedList: MutableList<Int> = java.util.LinkedList()
当java.util.LinkedList
类契约显然没有实现Kotlin接口MutableList
时?
在您的示例中,编译器没有推断任何东西.You告诉编译器,您的linkedList
变量将被视为MutableList<Int>
.编译器允许这样做,因为java.util.LinkedList
是Java List
接口的实现,它映射到Kotlin List
或MutableList
接口.
根据Tenour04提供的documentation,Java中的List<T>
是映射到Kotlin List<T>
或MutableList<T>
的映射类型--这取决于您的 Select .
请注意,这里使用的是单词type,而不是class.您所做的只是告诉编译器,您希望将该变量视为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>()
是完全有效的.在前一种情况下,因为您已经通知编译器immutableLinkedList
只是类型List<Int>
(请记住-您只能这样做,因为这个Kotlin类型映射到父类型LinkedList
),那么您将不能向它添加或从中删除even though the actual runtime implementation technically allows that.
这些机制有助于保持类型安全,并明确说明您正在使用的 struct 类型.如果您正在使用Kotlin,那么将linkedList注释为Kotlin类型MutableList
是good,因为很明显这个列表实际上是可变的.
另一方面,您可以想象一些情况,其中列表的实现实际上很重要,因此您可以 Select 完全放弃类型批注,并让编译器将其视为java.util.LinkedList
.
val myLinkedList = java.util.LinkedList<Int>()
个