我需要在 Kotlin 接口中创建一个 default void
方法。我遇到了一个问题,提示说 使用@JvmDefault
只允许在 -Xjvm-default
选项下使用。
我在哪里需要编写这个 Xjvm-default
?
我需要在 Kotlin 接口中创建一个 default void
方法。我遇到了一个问题,提示说 使用@JvmDefault
只允许在 -Xjvm-default
选项下使用。
我在哪里需要编写这个 Xjvm-default
?
@Target([AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY])
注解类JvmDefault
指定为非抽象Kotlin接口成员生成JVM默认方法。
使用此注解需要指定一个显式的编译参数:要么是
-Xjvm-default=enable
,要么是-Xjvm-default=compatibility
。当使用
-Xjvm-default=enable
时,对于每个带有@JvmDefault
的方法,仅会在接口中生成一个默认方法。在这种模式下,为现有方法添加@JvmDefault
注解可能会破坏二进制兼容性,因为它实际上将该方法从DefaultImpls
类中删除。当使用
-Xjvm-default=compatibility
时,在生成默认接口方法的同时,还会在DefaultImpls
类中生成一个兼容性访问器,该访问器通过合成访问器调用默认接口方法。在这种模式下,为现有方法添加@JvmDefault
注解是二进制兼容的,但会导致字节码中出现更多方法。从接口成员中删除此注解将导致二进制不兼容的更改。
仅能在 JVM 目标字节码版本 1.8(
-jvm-target 1.8
)或更高版本中生成默认方法。
@JvmDefault
方法不包括在接口委托中。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-default/index.html
如果您使用 Gradle,则将此参数添加到 Gradle 脚本中
https://kotlinlang.org/docs/reference/using-gradle.html
例如,将以下内容添加到 Gradle:
kotlinOptions {
freeCompilerArgs = ['-Xjvm-default=compatibility']
}
否则,如果您使用Kotlinc命令行编译器,请在命令行中的命令后添加-Xjvm-default=compatibility
。app
文件夹内的 build.gradle
,你会看到一个 android { }
,把它放在 android
的 {
和 }
之间。 - ygngyKotlin 1.4之后的新答案是:
tasks.withType(KotlinCompile::class).all {
kotlinOptions {
jvmTarget = "11"
// For creation of default methods in interfaces
freeCompilerArgs = listOf("-Xjvm-default=all")
}
}
你甚至可以完全省略@JvmDefault
!请参考https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#default-methods-in-interfaces。build.gradle
文件中添加以下代码。allprojects {
//Support @JvmDefault
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
kotlinOptions {
freeCompilerArgs = ['-Xjvm-default=enable'] //enable or compatibility
jvmTarget = "1.8"
}
}
@JvmDefault
,看起来与 这个问题 相似。
-Xjvm-default=enable
标志必须传递给编译器。由于我假设您不直接在命令行上使用 kotlinc
(Kotlin编译器):这个问答 包含有关如何在使用Gradle时向Kotlin编译器传递标志的信息。其他相关的失败输出可能为:is not abstract and does not override abstract method
。
关于传递-Xjvm-default
标志:
maven
在插件configuration
节点中,添加kotlin-maven-plugin。
<args>
<arg>-Xjvm-default=all</arg>
</args>
IDEA
在首选项中(通过dev.to):构建、执行、部署 -> 编译器 -> Kotlin编译器 -> 附加命令行参数 添加 -Xjvm-default=all
在项目结构中:模块 -> Kotlin -> 附加命令行参数 添加 -Xjvm-default=all
@JvmDefault
在kotlin > 1.4中不应该是必需的,但可能存在特殊情况,需要使用手册来确定所需的注释和标志的组合。