“相同的 JVM 签名”实现包含 getter 方法的 kotlin 接口
Posted
技术标签:
【中文标题】“相同的 JVM 签名”实现包含 getter 方法的 kotlin 接口【英文标题】:"same JVM signature" implementing kotlin interface containing getter method 【发布时间】: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.
所以我有几个问题:
-
为什么在实现接口时生成 2 个具有相同 JVM 签名的 getter 方法,而在不实现接口的情况下生成一个 getter 方法?
getTheString()
方法是 kotlin 自动生成的,为什么我还没有实现这个方法?
如何让变量生成的getter成为接口中方法的实现?
【问题讨论】:
你试过@get:JvmName("getTheString_")
吗?
@EpicPandaForce 解决了var theString
上的错误,但不使用变量生成的方法作为接口内方法的实现
如果您只是想要在构造函数中定义的属性的自定义实现,请查看我的答案。
【参考方案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。
【讨论】:
更好的选择是前两个,这似乎与您的答案中的任何内容都没有关系。我可以删除第三个,但请自行编辑您的答案。以上是关于“相同的 JVM 签名”实现包含 getter 方法的 kotlin 接口的主要内容,如果未能解决你的问题,请参考以下文章