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

时间:2018-12-28 20:54:29

标签: kotlin compiler-flags kotlinc jvm-default

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

我该在哪里写Xjvm-default

5 个答案:

答案 0 :(得分:6)

自Kotlin 1.4以来的 new 答案是:

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

        // For creation of default methods in interfaces
        freeCompilerArgs = listOf("-Xjvm-default=all")
    }
}

您甚至可以完全放弃@JvmDefault

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

答案 1 :(得分:3)

  

@Target([AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY])   注释类JvmDefault

     

指定应为以下对象生成JVM默认方法   非抽象的Kotlin界面成员。

     

使用此批注需要一个显式的编译参数来   指定为:-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

答案 2 :(得分:0)

这个与@JvmDefault有关的问题似乎与to this one类似。

-Xjvm-default=enable标志必须传递给编译器。由于我假设您不直接在命令行上使用kotlinc(Kotlin编译器),因此This Q&A包含有关在使用Gradle时如何将标志传递给Kotlin编译器的信息。

答案 3 :(得分:0)

在根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"
    }
}

答案 4 :(得分:0)

其他相关失败输出可以是:Field 'id' expected a number but got <built-in function id>.

关于传递<int:id>标志:

专家

在插件is not abstract and does not override abstract method节点中进行kotlin-maven-plugin添加

-Xjvm-default

想法

在首选项中(通过dev.to):构建,执行,部署->编译器-> Kotlin编译器-> 其他命令行参数添加configuration

在项目结构中:模块-> Kotlin-> 其他命令行参数添加<args> <arg>-Xjvm-default=all</arg> </args>

-Xjvm-default=all对于Kotlin> 1.4而言不是必需的,但是可能会有特殊的星座,其中manual应该有助于确定需要注释和标记的哪种组合。