interface MyInterface {
fun getTheString(): String
}
class MyClass(var theString: String) : MyInterface {
...
}
通常,当我在一个类的构造函数中有一个变量时,它将为该变量创建一个getter和setter方法。在MyClass
中,方法getTheString()
和setTheString(String)
在未实现MyInterface
时存在。
当MyClass
实现MyInterface
时,出现错误消息:
意外覆盖:以下声明具有相同的JVM签名(getTheString()Ljava / lang / String;):
我也有错误:类'MyClass'不是抽象的,并且没有实现抽象成员公共抽象乐趣 getTheString():在MyInterface中定义的字符串。
所以我有几个问题:
getTheString()
方法却没有实现?答案 0 :(得分:1)
如果界面确实在Kotlin中,并且您可以对其进行更改,则应该为
interface MyInterface {
val theString: String
}
首先。 Java仍然会看到getTheString()
,但是在Kotlin中实现和使用它都更好。
否则,一个不错的选择是
class MyClass(@set:JvmName("setTheString") var _theString: String) : MyInterface {
override fun getTheString() = _theString
}
不幸的是,它仍然有一个重复的getter,并且您不能仅将getter设为私有。或者
class MyClass(private var _theString: String) : MyInterface {
override fun getTheString() = _theString
fun setTheString(value: String) {
_theString = value
}
}
请注意,如果接口使用Java,则getTheString()
将作为属性显示给Kotlin。
在Kotlin错误跟踪器上查看问题https://youtrack.jetbrains.com/issue/KT-6653和https://youtrack.jetbrains.com/issue/KT-19444。