2017-11-27 11 views
4

のプロパティのゲッターに@JvmNameを適用します。Javaの相互運用:通常、我々はkotlinに次のコードを書くことができるインタフェースまたは抽象クラス

val hasValue : Boolean 
    @JvmName("hasValue") get() = true 

これはJavaの相互運用方法hasValue()代わりのgetHasValue()を生成します。 。

しかし、インターフェイスで、これは私のコンパイルエラーを与える:

同じ抽象クラスに次の宣言のために行く
val hasValue : Boolean 
    @JvmName("hasValue") get 

:だからここ

abstract val hasValue : Boolean 
    @JvmName("hasValue") get 

は私の質問は:どのように私はkotlinのコンパイラに、getHasValue()の代わりにhasValue()を使用してkotlinインターフェイスのプロパティのゲッタ(およびセッタ)を使用するように指示できますか?

答えて

1

私はKotlinが/overrideプロパティ/機能で@JvmNameを使用することにいくつかの制限があると思います。 open/override関数での@JvmNameの使用を禁止すると、インタフェース/スーパークラスとサブクラスで異なるjvmNameを持つことを避けることができます。次の例では

、私はインターフェイス(hasValue)とは異なり、それはコンパイルエラーを与えるjvmName(hasValueImpl)でオーバーライドプロパティのゲッターに注釈を付けしようとしています:

'@JvmName' annotation is not applicable to this declaration

interface Abstract { 

    @get:JvmName("hasValue")  //Compile error 
    val hasValue: Boolean 
     get() = false 
} 

open class Impl : Abstract { 

    @get:JvmName("hasValueImpl") //Compile error 
    final override val hasValue: Boolean 
     get() = false 

    @get:JvmName("hasValue2")  //Compile error if hasValue2 is open 
    val hasValue2: Boolean 
     get() = false 
} 
+0

あなたの議論オーバーライドプロパティには意味がありますが、何もオーバーライドしない抽象的な/開いているプロパティに対しては意味がありません。注釈付きプロパティをオーバーライドすると、jvmシグニチャを継承する必要があることを意味しますが、 – msrd0

+0

あなたが正しいですが、 '@ JvmName'はオーバーライドされた関数とオーバーライド可能な関数の両方で禁止されています。 https://github.com/JetBrains/kotlin/blob/19e38bbc725ec68c9d40bc5c4ad8945266df7231/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt#L141 @ msrd0、この回答は正しい受け入れられるべきである。 –

+0

@ Miha_x64この答えは正しいですが、 "Kotlinコンパイラにはどのように伝えることができますか?"という質問には答えませんが、 "Kotlinコンパイラに伝えることはできますか?"という質問には答えるでしょう。 – msrd0

関連する問題