【发布时间】:2019-03-13 17:46:54
【问题描述】:
我正在编写一个实现接口的类,该接口公开setSelected 方法。这个类将有一个selected 属性:
private class Foo : IFoo {
var selected = false
override fun setSelected(isActive: Boolean) {
selected = isActive
}
}
但是编译器抱怨说,因为 Kotlin 为 selected 生成了一个 setter,这两种方法会发生冲突:
Error:(14, 9) Kotlin: [com.bar.jvmTest] Platform declaration clash: The following declarations have the same JVM signature (setSelected(Z)V):
fun <set-selected>(<set-?>: Boolean): Unit defined in foo.bar.baz.Foo
fun setSelected(isActive: Boolean): Unit defined in foo.bar.baz.Foo
Error:(24, 9) Kotlin: [com.bar.jvmTest] Platform declaration clash: The following declarations have the same JVM signature (setSelected(Z)V):
fun <set-selected>(<set-?>: Boolean): Unit defined in foo.bar.baz.Foo
fun setSelected(isActive: Boolean): Unit defined in foo.bar.baz.Foo
override,因此我的类没有完全实现接口:
Error:(11, 13) Kotlin: [com.bar.jvmTest] Class 'Foo' is not abstract and does not implement abstract member public abstract fun setSelected(isActive: Boolean): Unit defined in bar.baz
selected 重命名为例如dataSelected 以便生成的 setter 不会与方法冲突,但应该有办法保持这个简单的属性名称 并 按预期实现接口。
有没有办法让 Kotlin 编译器不为此属性生成 setter,或者将其标记为 override?
【问题讨论】:
标签: kotlin properties getter-setter generated-code