java - Kotlin 如何使用 JDK 1.8 调用 Java 11 代码?
问题描述
我正在玩一个 Kotlin 项目,它有一些 Java 11 调用,并注意到它似乎使用 Java 8 构建和运行良好。
特别是 to 的调用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 11 的isBlank()
方法,而是调用了 Kotlin 的可应用于 java.lang.String的 isBlank 扩展函数。
推荐阅读
- stenciljs - StencilJS 插槽内容闪烁可见内容
- microsoft-teams - MS Teams:当任务模块通过深度链接打开时,如何为它定义 closeHandler?
- pandas - 解析特殊字符的xml时面临的错误
- java - 将一个字节数组 (BLOB IBM DB2) 中的多个图像导出到磁盘
- r - 如何在特定列之后添加空列并根据 R 闪亮中的用户特定替换值
- python - 如何基于过滤计算数据框列中的值
- google-cloud-platform - Google Cloud Functions 中的 HTTPS 是否支持使用 PKI 的 mTLS?
- javascript - 如何重置颜色网格?
- orientdb - 从 OrientDB 迁移到 AWS Neptune
- r - 在函数中将对象名称转换为字符串