【问题标题】:"same JVM signature" implementing kotlin interface containing getter method“相同的 JVM 签名”实现包含 getter 方法的 kotlin 接口
【发布时间】:2019-08-22 19:48:34
【问题描述】:
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;):

  • public final fun (): MyClass中定义的字符串
  • public abstract fun getTheString(): MyClass 中定义的字符串

我也有错误:“MyClass”类不是抽象的,没有实现抽象成员public abstract fun getTheString(): String defined in MyInterface.

所以我有几个问题:

  1. 为什么在实现接口时生成 2 个具有相同 JVM 签名的 getter 方法,而在不实现接口的情况下生成一个 getter 方法?
  2. getTheString() 方法是 kotlin 自动生成的,为什么我还没有实现这个方法?
  3. 如何让变量生成的getter成为接口中方法的实现?

【问题讨论】:

  • 你试过@get:JvmName("getTheString_")吗?
  • @EpicPandaForce 解决了var theString上的错误,但不使用变量生成的方法作为接口内方法的实现
  • 如果您只是想要在构造函数中定义的属性的自定义实现,请查看我的答案。

标签: intellij-idea kotlin interface


【解决方案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

【讨论】:

  • 更好的选择是前两个,这似乎与您的答案中的任何内容都没有关系。我可以删除第三个,但请自行编辑您的答案。
猜你喜欢
  • 2011-12-13
  • 1970-01-01
  • 2020-08-29
  • 2015-05-29
  • 2022-08-17
  • 2020-12-05
  • 1970-01-01
  • 2015-03-23
  • 2015-11-21
相关资源
最近更新 更多