为什么会这样?
val foo: kotlin.collections.List<String> = java.util.ArrayList()
ArrayList
未继承Kotlin List
,是吗?
答案 0 :(得分:4)
这是因为kotlin.collections.List
和其他类型的mapped type是{{3}}:在编译JVM期间,它的用法被编译成Java java.util.List
接口的相应用法。
答案 1 :(得分:4)
这样做的原因是Kotlin编译器将Java平台特定类型(例如java.util.ArrayList()
)映射到Kotlin平台无关类型(kotlin.collections.List
)。毫不奇怪,这就是他们被称为Mapped Types的原因。
要理解的关键事实是在编译之后,您只需要二进制兼容性。如果java平台上的所有Kotlin代码在使用java.util.List
对象时都使用kotlin.collections.List
接口,那么java引擎上的堆栈操作就可以了。当然,相反的方向也是如此。
至于另一个方向:正如this question指出的那样,至少在Java平台上,kotlin.collections.ArrayList
基本上是typealias
的{{1}}。