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

Mic*_*ush 41 kotlin

使用下面的代码,我在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?
Run Code Online (Sandbox Code Playgroud)

Java类,JavaInterface.java:

public interface JavaInterface {
  public String getName();
}
Run Code Online (Sandbox Code Playgroud)

科特林班, KotlinClass.kt

public class KotlinClass(val name: String?) : JavaInterface
Run Code Online (Sandbox Code Playgroud)

我已经尝试通过添加来覆盖'getter'方法override fun getName(): String? = name,但这会产生相同的错误.

我可以通过这样做来看到一种解决方法:

public class KotlinClass(val namePrivate: String?) : JavaInterface {
  override fun getName(): String? = namePrivate
}
Run Code Online (Sandbox Code Playgroud)

但在我的实际案例中,我有许多属性要实现,也需要setter.对每个房产这样做似乎不是很Kotlin-ish.我错过了什么?

小智 39

使该变量private解决问题.

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

  • 是否需要公开变量? (2认同)

Mah*_*alv 16

Kotlin的named注解功能@JvmName将解决Java和Kotlin中具有相同签名时的重复问题。

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

// Signature: function(Ljava/lang/String)
Run Code Online (Sandbox Code Playgroud)

与使用JvmName将是:

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

// Signature: functionOfKotlin(Ljava/lang/String)
Run Code Online (Sandbox Code Playgroud)

截至 2023 年 5 月,这不适用于接口


Ren*_*cia 8

您可以使用 @JvmField 指示编译器不生成 getter/setter,并且您可以实现您的 setter 和 getter。有了这个,您的代码在 Java(作为属性 getter/setter)和 Kotlin 作为属性运行良好

示例: JAVA

public interface Identifiable<ID extends Serializable> 
{
   ID getId();
} 
Run Code Online (Sandbox Code Playgroud)

科特林

class IdentifiableImpl(@JvmField var id: String) :Identifiable<String> 
{
   override fun getId(): String 
   {
       TODO("not implemented")
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 这让我觉得是最好的答案。它直接解决了这个问题,并适用于接受的答案不会的其他情况。 (2认同)

Lu5*_*u55 5

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

爪哇:

public inteface SomeInterface {
    String getFoo();
}
Run Code Online (Sandbox Code Playgroud)

科特林:

class Implementation(@JvmField val foo: String) : SomeInterface {
    override fun getFoo() = foo
}
Run Code Online (Sandbox Code Playgroud)