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

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 Streams API比较两个不同的Java集合对象和一个公共属性

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

如何使用Maven和Spring Boot将构建时初始化、跟踪类初始化正确传递到本机编译

只需最少的代码更改即可将版本号标记添加到日志(log)

如何从错误通道回复网关,使其不会挂起

类型集合的Jackson JsonNode:类型引用的对象读取器应该是Singleton吗?

Domino Designer 14中的保存代理添加了重影库

如何在Cosmos DB(Java SDK)中增加默认响应大小

try 从REST API返回对象列表时出错

JNI:将代码打包成自包含的二进制文件

与IntArray相比,ArrayList<;Int>;对于大量元素的性能极差

如何配置空手道以使用FeignClient或RestTemplate代替ApacheHttpClient

如何在Java springboot中从一个端点发送多个时间响应?

如何从HttpResponse实例获取Entity对象的内容?

如何处理两个几乎相同的XSD文件?

Win32函数的JNA绑定DwmGetColorizationColor返回E_INVALIDARG错误

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

Bash数组的单引号元素并使用空格连接

如何在JSP中从select中获取值并将其放入另一个select

JavaFX 不嵌入谷歌 map html