2016-07-15 50 views
13

接口的函數名稱與屬性的getter名稱有意衝突,但由於意外覆蓋問題,它被編譯器禁止。是否有可能指示編譯器這是故意的?接口的函數與Property的getter衝突

interface A { 
    fun getFoo() 
} 

class B: A { 
    val foo 
} 

回答

13

此功能似乎沒有以任何方式實施。

@上similar question AndreyBreslav的評論:

不能覆蓋Java方法與目前科特林性能。這將是很好,如果我們可以支持它,但我們不知道如何做到這一點始終如一地爲混合層次


這不會解決你的問題,但至少可以使代碼編譯:你可以改變JVM名稱與@JvmName annotation的吸氣劑:

interface A { 
    fun getFoo(): SomeType 
} 

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

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

此外,考慮換一個更慣用的方法:在你的界面定義val - 屬性,這樣就可以在執行其覆蓋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