当前位置: 首页 > 知识库问答 >
问题:

“相同的JVM签名”实现包含getter方法的kotlin接口

朱兴运
2023-03-14
interface MyInterface {
    fun getTheString(): String
}
class MyClass(var theString: String) : MyInterface {
    ...
}

通常,当我在类的构造函数中有一个变量时,它会为该变量创建一个getter和setter。在<code>MyClass方法。

MyClass实现MyInterface时,我收到错误:

意外重写:以下声明具有相同的JVM签名(getHeString()Ljava/lang/String;):

  • public final fun():MyClass中定义的字符串
  • 公共抽象fun getTheString():MyClass中定义的字符串

我也有错误:类“MyClass”不是抽象的,不实现抽象成员公共抽象乐趣 getTheString():在我的接口中定义的字符串。

所以我有几个问题:

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

共有1个答案

毛镜
2023-03-14

如果接口确实是静态编程语言,并且您可以更改它,则应该是

interface MyInterface {
    val theString: String
}

首先。Java仍然会看到getTheString(),但是在静态编程语言中实现和使用更好。

否则一个好的选择是

class MyClass(@set:JvmName("setTheString") var _theString: String) : MyInterface {
    override fun getTheString() = _theString
}

不幸的是,它仍然有一个重复的获取器,并且你不能只将获取者设为私有。或

class MyClass(private var _theString: String) : MyInterface {
    override fun getTheString() = _theString
    fun setTheString(value: String) { 
        _theString = value
    }
}

请注意,如果接口是 Java 格式的,则 GetTheString() 将作为属性对 Kotlin 可见。

参见Kotlin bug追踪器上的https://youtrack.jetbrains.com/issue/KT-6653和https://youtrack.jetbrains.com/issue/KT-19444问题。

 类似资料:
  • public final fun():myclass中定义的字符串 公共抽象乐趣getTheString():myclass中定义的字符串 我还有一个错误:类'MyClass'不是抽象的,并且没有实现MyInterface中定义的抽象成员公共抽象乐趣getTheString():String。 所以我有几个问题: null

  • 问题内容: 假设我必须实现在两个不同的包中声明的两个不同的接口(在两个不同的独立项目中)。 我有包装 并包装 在我的包里 如何处理这种情况? 问题答案: 正如常见问题解答所提到的 其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。 在Go的类型系统中,仅按名称进行匹配并要求类型一致是简化的主要决定 。 在您的情况下,您将满足两个接口。 您可

  • 问题内容: 我有两个Java接口和一个实现类。 (我已经使用Eclipse直接运行程序,并且我没有尝试通过从命令行进行显式编译来检查任何编译器警告等)。 为什么它们运行没有问题?为什么Java允许这样做,即使它满足两个接口的“合同”,却在实现类时造成歧义? 更新了示例。 问题答案: Java语言规范的第8.1.5节专门允许这种情况: 类中的单个方法声明可以实现多个超级接口的方法。例如,在代码中:

  • 使用下面的代码,我在IntelliJ IDEA 13.1.6和Kotlin插件0.11.91.AndroidStudio.3中收到以下错误: Java类,< code>JavaInterface.java: Kotlin类, 我尝试通过添加<code>override fun getName():String?=名称,但这会产生相同的错误。 我可以想到一种替代方法: 但是在我的现实世界中,我有许多

  • 我试图从Kotlin代码扩展RuntimeException并实现Java定义的GraphQLError接口时遇到以下错误。这是一个错误: 下面是我的代码: 其中是一个接口,在Java中定义如下所示: 它似乎与中定义的冲突。 如何创建自己的运行时异常,实现GraphqlError? PS:我也尝试了下面的,收到了一个非常相似的错误:

  • 问题内容: 此代码完美地工作。方法test()适用于两个接口。幕后到底发生了什么?在实际情况下,此功能有何用处? 问题答案: 因为它是一个接口,所以不会造成任何危害。通过实现和,您基本上是在为您的课程使用蓝图。双方并说,应实施一个名为方法 您的类实现了该方法,因此接口已完成其工作。 基本上,您的班级在说:“哦,我需要因为接口而实现”,然后您就实现了。然后您的班级说:“哦,嘿,由于接口我需要再次实现