@JvmDefault以及如何添加编译器选项

Evg*_*sha 8 compiler-flags kotlin kotlinc jvm-default

我需要default void在Kotlin界面中制作一个方法。我遇到了一个问题,提示说@JvmDefault仅允许使用-Xjvm-defaultoption”

我该在哪里写Xjvm-default

小智 14

在root中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"
    }
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*fel 8

自 Kotlin 1.4 以来的答案是:

tasks.withType(KotlinCompile::class).all {
    kotlinOptions {
        jvmTarget = "11"

        // For creation of default methods in interfaces
        freeCompilerArgs = listOf("-Xjvm-default=all")
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你甚至可以@JvmDefault完全放弃!

参见 https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#default-methods-in-interfaces


Bah*_*man 5

@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']
}
Run Code Online (Sandbox Code Playgroud)

否则,如果您使用Kotlinc命令行编译器-Xjvm-default=compatibility,请在命令行中的命令后添加

  • 在没有附加信息的情况下复制文档文本对于如何将标志传递给编译器可能不是很有帮助。 (3认同)