为什么Java ArrayList与Kotlins List接口兼容

时间:2018-03-22 19:10:22

标签: kotlin

为什么会这样?

val foo: kotlin.collections.List<String> = java.util.ArrayList()

ArrayList未继承Kotlin List,是吗?

2 个答案:

答案 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}}。