首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在实现Java接口时,如何克服“相同的JVM签名”错误?

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

Stack Overflow用户
提问于 2015-03-26 07:33:56
回答 7查看 24.5K关注 0票数 64

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

代码语言:javascript
运行
复制
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类,JavaInterface.java

代码语言:javascript
运行
复制
public interface JavaInterface {
  public String getName();
}

Kotlin类,KotlinClass.kt

代码语言:javascript
运行
复制
public class KotlinClass(val name: String?) : JavaInterface

我试图通过添加override fun getName(): String? = name来重写'getter‘方法,但是产生了同样的错误。

我可以通过执行以下操作来查看一种解决方法:

代码语言:javascript
运行
复制
public class KotlinClass(val namePrivate: String?) : JavaInterface {
  override fun getName(): String? = namePrivate
}

但在我的实际案例中,我有许多属性需要实现,并且还需要setter。为每个属性执行此操作看起来不太像Kotlin。我遗漏了什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-06-23 18:52:28

将该变量设为private可以解决这个问题。

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

票数 68
EN

Stack Overflow用户

发布于 2019-12-02 16:14:12

@JvmName的注释特性将解决Java和Kotlin具有相同签名时的重复问题。

代码语言:javascript
运行
复制
fun function(p: String) {
   // ...
}

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

使用JvmName将会:

代码语言:javascript
运行
复制
@JvmName("functionOfKotlin")
fun function(p: String) {
   // ...
}

// Signature: functionOfKotlin(Ljava/lang/String)
票数 6
EN

Stack Overflow用户

发布于 2019-02-08 19:31:44

我认为最具可读性的组合是字段+单表达式函数的显式接口实现( @Renato Garcia的答案和@Steven Spungin的答案的组合):

Java:

代码语言:javascript
运行
复制
public inteface SomeInterface {
    String getFoo();
}

Kotlin:

代码语言:javascript
运行
复制
class Implementation(@JvmField val foo: String) : SomeInterface {
    override fun getFoo() = foo
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29268526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档