实现包含getter方法的

时间:2019-04-01 15:25:44

标签: intellij-idea kotlin interface

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():MyClass中定义的字符串

我也有错误:类'MyClass'不是抽象的,并且没有实现抽象成员公共抽象乐趣 getTheString():在MyInterface中定义的字符串。

所以我有几个问题:

  1. 为什么在实现接口时用相同的JVM签名生成2个getter方法,而在不实现接口的情况下为什么生成一种getter方法呢?
  2. 为什么Kotlin自动生成getTheString()方法却没有实现?
  3. 如何获取由变量生成的getter,使其成为接口中方法的实现?

1 个答案:

答案 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-6653https://youtrack.jetbrains.com/issue/KT-19444