为什么 Kotlin 集合的运行时类是 Java 类?

mic*_*ech 1 java android kotlin

在 JetBrains(在 Coursera)的“Java 开发人员的 Kotlin”课程中,有人告诉我们,Kotlin 代码被直接编译为字节码。然后在 JVM 上执行该字节码。

但是当我这样做时:

var list = listOf<String>("A", "B", "C")
println(list::class) // => Prints "class java.util.Arrays$ArrayList"
Run Code Online (Sandbox Code Playgroud)

显然,下面使用了普通的 Java ArrayList。所以我很困惑...

Kotlin 只是一些“更现代”的语法东西,它在下面使用 Java?

实际上是一些语法糖,它放在顶部,以便人们可以以更好的方式编写代码。但在它下面仍然是旧的 Java 东西。

Ste*_*n C 5

Kotlin 只是一些“更现代”的语法东西,它在下面使用 Java?

不。您 Kotlin 源代码 >>is<< 编译为字节码。

但是您的代码正在使用listofKotlin 库函数,并且该函数的实现返回一个作为 Java 类实例的值。

为什么?

  1. 这是可能更容易/更快地实现它的方式。(根据列表对象的类型,我们可以推断它listof只是在调用java.util.Arrays.asList(...)。)
  2. 可能在重新实现它没有优势; 例如没有性能优势。
  3. 可能是缺点; 例如,对于需要 Kotlin 代码与使用标准 Java 集合类的 Java 进行互操作的人来说,这可能会导致问题。