【问题标题】:How is Kotlin able to call Java 11 code using JDK 1.8?Kotlin 如何使用 JDK 1.8 调用 Java 11 代码?
【发布时间】:2020-08-17 14:52:01
【问题描述】:

我正在玩一个 Kotlin 项目,它有一些 Java 11 调用,并注意到它似乎使用 Java 8 构建和运行良好。

特别是对 java.lang.String#isBlank() 的调用,它是在 Java 11 中引入的。

我正在使用 Gradle 来构建和运行测试。 Build JDK 设置为 JDK 1.8,Kotlin 编译目标也是 1.8:

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs += listOf("-Xjsr305=strict")
        jvmTarget = "1.8"
    }
}
gradle -v

------------------------------------------------------------
Gradle 6.6
------------------------------------------------------------

Build time:   2020-08-10 22:06:19 UTC
Revision:     d119144684a0c301aea027b79857815659e431b9

Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          1.8.0_265 (AdoptOpenJDK 25.265-b01)
OS:           Mac OS X 10.15.6 x86_64

这是一个单元测试,它调用 Java 11 但仍然可以编译和运行:

import org.junit.jupiter.api.Test

class BlankTest {

    @Test
    fun testBlank() {
        val s = java.lang.String("test string")
        val blank = s.isBlank()
        println("Input string blank? : $blank")
    }
}

这怎么可能?

【问题讨论】:

    标签: java kotlin gradle


    【解决方案1】:

    答案是您实际上并没有使用 Java 11 的 isBlank() 方法,而是调用了可以应用于 java.lang.String 的 Kotlin's isBlank extension function

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 2021-01-17
      • 1970-01-01
      • 2019-08-31
      • 2021-03-27
      • 2012-05-16
      • 2021-10-12
      • 2019-11-21
      相关资源
      最近更新 更多