web-dev-qa-db-ja.com

@JvmDefaultとコンパイラオプションの追加方法

Kotlinインターフェースで_default void_メソッドを作成する必要があります。私は問題に遭遇し、ヒントは_@JvmDefault_の使用は_-Xjvm-default_オプションでのみ許可されますと述べました。

これをどこに書く必要がありますか_Xjvm-default_?

10
Evgesha

@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を追加します

9
Bahman

ルート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"
    }
}
2
Fang

@JvmDefault に関するこの質問は、かなり似ています これと同じ

-Xjvm-default=enableフラグをコンパイラに渡す必要があります。コマンドラインで kotlinc (Kotlinコンパイラ)を直接操作しないことを前提としているため、次のようになります。 このQ&A には、フラグを渡す方法に関する情報が含まれていますGradleを使用する場合、Kotlinコンパイラに.

1
Markus Weninger