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

用下面的代码,我得到了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类, JavaInterface.java

 public interface JavaInterface { public String getName(); } 

Kotlin类, KotlinClass.kt

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

我试着通过添加override fun getName(): String? = nameoverride fun getName(): String? = name getter方法override fun getName(): String? = name override fun getName(): String? = name ,但是会产生相同的错误。

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

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

但在现实世界的情况下,我有一些属性可以实现,也需要setter。 为每个属性做这个似乎不是很Kotlin ish。 我错过了什么?

使private变量解决问题。

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

另一个解决方法是在抽象Kotlin类中声明属性,然后编写一个扩展KotlinClass并实现JavaInterface的小型Java类。

 // JavaInterface.java public interface JavaInterface { int getFoo(); void setFoo(int value); } // KotlinClass.kt abstract class KotlinClass(open var foo : Int = 0) { } // JavaAdapter.java class JavaAdapter extends KotlinClass implements JavaInterface { // all code in KotlinClass, but can't implement JavaInterface there // because kotlin properties cannot override java methods. } 
 public interface JavaInterface { public String getName(); } public class KotlinClass(val namePrivate: String?) : JavaInterface { private var name = namePrivate override fun getName(): String? { return name } } 

我们发现要使用相同的名字而不会发生冲突,控制器的参数必须是私有的 ,而且还必须重写接口方法。 你不需要任何额外的支持领域。 而且,你的表达式主体分配不会递归,所以你可以安全地使用这个语法。

Java接口

 interface IUser { String getUserScope(); String getUserId(); } 

Kotlin类

 class SampleUser(private val userScope: String, private val userId: String) : IUser { override fun getUserId() = userId override fun getUserScope() = userScope } 

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

例如: JAVA

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

KOTLIN

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

我们做得到!

 package com.example.mykotlin import android.support.v7.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) tv.text = "Hello MyKotlin" tv.textSize = 20.0f } }