以下代码如何编译而没有任何错误?

var linkedList: MutableList<Int> = java.util.LinkedList()

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

推荐答案

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

根据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类型MutableListgood,因为很明显这个列表实际上是可变的.

另一方面,您可以想象一些情况,其中列表的实现实际上很重要,因此您可以 Select 完全放弃类型批注,并让编译器将其视为java.util.LinkedList.

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

Java相关问答推荐

Java在模块化jar文件中找不到类,但是javap可以

转换为Biggram

Android Studio—java—在onBindViewHolder中,将断点和空白添加到BackclerView中

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

如何找到MongoDB文档并进行本地化?

如何在Java中从XML中获取特定的 node ,然后将其删除?

SpringBoot Kafka自动配置-适用于SASL_PLAYTEXT的SSLBundle 包,带SCRAM-SHA-512

try 将JSON字符串响应从API转换为映射字符串、对象>;时出错

Kotlin Val是否提供了与Java最终版相同的可见性保证?

buildDir:File!&#的getter解决方案是什么?39.被抛弃

无法将GSON导入到我的JavaFX Maven项目

Java中HashSet的搜索时间与TreeSet的搜索时间

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

如何在SWT菜单项文本中保留@字符

如何使用jooq更新记录?

如何对存储为字符串的大数字数组进行排序?

按长度排序字符串数组

PhantomReference无法访问时会发生什么?

Spring Boot Security-每个端点都被403禁止,Spring记录一个BasicErrorController#错误(HttpServlet请求)

如何从指定某些字段的父对象创建子对象