接口的函数名称故意与属性的getter名称冲突,但由于意外覆盖问题,编译器禁止它。有可能指示编译器这是故意的吗?
interface A {
fun getFoo()
}
class B: A {
val foo
}
答案 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
}
}