2016-07-15 17 views
13

インターフェイスの関数名がプロパティのゲッタ名と意図的に衝突しますが、偶発的なオーバーライドの問題によりコンパイラで禁止されています。これは意図的なコンパイラに指示することは可能ですか?Interfaceの関数がPropertyのゲッターと衝突する

interface A { 
    fun getFoo() 
} 

class B: A { 
    val foo 
} 

答えて

13

この機能は実装されていないようです。あなたは、現時点ではKotlinのプロパティを持つJavaメソッドをオーバーライドすることはできません

similar questionにAndreyBreslavさんのコメント@

。我々はそれをサポートすることができればいいだろうが、我々はあなたの問題を解決していません混在階層


これをするためにそれを一貫して行う方法を知りませんが、少なくとも、コードのコンパイルを行いますあなたが変更することができます@JvmName annotationとゲッターのJVM名:

interface A { 
    fun getFoo(): SomeType 
} 

class B: A { 
    override fun getFoo() = foo 

    val foo: SomeType = someValue() 
     @JvmName("getFoo_") get() = field 
} 

また、より多くの慣用的なアプローチに変更することを検討:あなたは、実装でそれをオーバーライドすることができるように、あなたのインタフェースでval -propertyを定義しますs:

interface A { 
    val foo: SomeType 
} 

class B : A { 
    override val foo: SomeType = someValue() 
} 

class C : A { 
    override val foo: SomeType 
     get() = someCustomGetter() 
} 
+1

UPD:Kotlin-idiomaticアプローチを追加しました。 – hotkey

関連する問題