Kotlin中有这样一段代码:
val collection: java.util.Collection<String> = java.util.ArrayList<String>()
为什么编译时出现错误:
type mismatch: inferred type is ArrayList<String> but Collection<String> was expected
. 这可能是正常行为,但我不明白为什么。
Kotlin中有这样一段代码:
val collection: java.util.Collection<String> = java.util.ArrayList<String>()
为什么编译时出现错误:
type mismatch: inferred type is ArrayList<String> but Collection<String> was expected
. 这可能是正常行为,但我不明白为什么。
在 Kotlin 类型层次结构中,Java 标准库的类型
java.util.Collection
和java.util.List
其他集合接口被替换为对应的 fromkotlin.collections.*
,默认导入,例如List
,这些就是所谓的映射类型。在这种情况下,Java 标准库中的每个集合接口都映射到两种类型——只读接口和可变集合接口:
java.util.List
→List
(不包含用于更改列表的函数)和MutableList
.因此,Kotlin 的编译器在检查类型时
ArrayList
不是java.util.List
orjava.util.Collection
(因此错误),而是在其类型kotlin.collections.List
层次结构中有 ,kotlin.collections.Collection
。IntelliJ IDEA 发出警告,指出
java.util.*
不应在 Kotlin 代码中使用来自的集合接口。修复错误的最简单方法是将中的接口替换为
java.util.*
中的相应接口kotlin.collections.*
:或者,分别
另请参阅StackOverflow 上的类似问题。