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
を追加します
ルート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コンパイラ)を直接操作しないことを前提としているため、次のようになります。 このQ&A には、フラグを渡す方法に関する情報が含まれていますGradleを使用する場合、Kotlinコンパイラに.