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

实现Java接口时如何克服“相同JVM签名”错误?

公冶智刚
2023-03-14

使用下面的代码,我在IntelliJ IDEA 13.1.6和Kotlin插件0.11.91.AndroidStudio.3中收到以下错误:

Platform declaration clash: The following declarations have the same JVM signature (getName()Ljava/lang/String;):
  • public open fun getName(): kotlin.String?
  • internal final fun <get-name>(): kotlin.String?

Java类,< code>JavaInterface.java:

public interface JavaInterface {
  public String getName();
}

Kotlin类,KotlinClass.kt

public class KotlinClass(val name: String?) : JavaInterface

我尝试通过添加<code>override fun getName():String?=名称,但这会产生相同的错误。

我可以想到一种替代方法:

public class KotlinClass(val namePrivate: String?) : JavaInterface {
  override fun getName(): String? = namePrivate
}

但是在我的现实世界中,我有许多属性要实现,也需要设置器。为每个属性执行此操作似乎不是很 Kotlin 式。我错过了什么?

共有3个答案

齐坚成
2023-03-14

名为@JvmName的静态编程语言的注释特性将解决Java和静态编程语言在具有相同签名时的重复问题。

fun function(p: String) {
   // ...
}

// Signature: function(Ljava/lang/String)

使用JvmName将是:

@JvmName("functionOfKotlin")
fun function(p: String) {
   // ...
}

// Signature: functionOfKotlin(Ljava/lang/String)
郭子航
2023-03-14

您可以使用@JvmField for来指示编译器不生成getter/setter,并且您可以实现您的setter和getter。这样,您代码在Java(作为属性getter/setter)和Kotlin(作为属性)中都能很好地工作

例如:JAVA:

public interface Identifiable<ID extends Serializable> 
{
   ID getId();
} 

科特林:

class IdentifiableImpl(@JvmField var id: String) :Identifiable<String> 
{
   override fun getId(): String 
   {
       TODO("not implemented")
   }
}
邢博学
2023-03-14

将该变量设置为私有可以解决问题。

公共类 KotlinClass(私有 val name: String?) : JavaInterface

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

  • 通常,当我在类的构造函数中有一个变量时,它会为该变量创建一个getter和setter。在<code>MyClass方法。 当实现时,我收到错误: 意外重写:以下声明具有相同的JVM签名(getHeString()Ljava/lang/String;): public final fun():MyClass中定义的字符串 公共抽象fun getTheString():MyClass中定义的字符串

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

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

  • 我创建了一个bean,如下所示 在一个测试类中,我模拟该类如下: 应用程序在没有错误的情况下启动。但是测试并没有模仿bean CustomerEmailSenderImpl2。bean总是被实例化,并执行真正的代码。即使在测试类中从接口到类名的更改也没有帮助: 需要什么来模拟bean CustomerEmailSenderImpl2?

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