我需要在Kotlin界面中制作一个default void
方法。我遇到了一个问题,提示说 @JvmDefault
的使用只允许使用-Xjvm-default
选项。
我该在哪里写Xjvm-default
?
答案 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应该有助于确定需要注释和标记的哪种组合。