界面功能与Property的getter冲突

时间:2016-07-15 11:34:25

标签: kotlin

接口的函数名称故意与属性的getter名称冲突,但由于意外覆盖问题,编译器禁止它。有可能指示编译器这是故意的吗?

interface A {
  fun getFoo()
}

class B: A {
  val foo
}

2 个答案:

答案 0 :(得分:17)

此功能似乎无法以任何方式实施。

@ AndreyBreslav对similar question的评论:

  

目前,您无法使用Kotlin属性覆盖Java方法。如果我们能够支持它会很好,但我们不知道如何一致地为混合层次结构做到这一点

这不能解决您的问题,但至少会使代码编译:您可以使用@JvmName annotation更改getter的JVM名称:

interface A {
    fun getFoo(): SomeType
}

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

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

另外,请考虑更改为更惯用的方法:在界面中定义val - 属性,以便在实现中覆盖它:

interface A {
    val foo: SomeType
}

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

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

答案 1 :(得分:1)

在我们坚持使用Kotlin之前,上面回答的Kotlin惯用方法是可以的,但是如果这些接口是用Java定义的,则不适用。 KT-6653报告了很多命题,但目前都没有实现。我目前正在写一些应用程序,部分用Java编写,部分用Kotlin编写,这个问题完全消除了“ Kotlin-Java互操作性”的概念。

我发现唯一可解决的解决方案是以下解决方案:

public interface A {
  String getFoo();
}
class B(private val _foo: String): A {

  override fun getFoo(): String = _foo

}

还可以使用setter扩展此类:

class B(private var _foo: String): A {

  override fun getFoo(): String = _foo

  fun setFoo(foo: String) {
    _foo = foo
  }

}