Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to overcome "same JVM signature" error when implementing a Java interface?

Tags:

kotlin

With the code below, I am getting the following error in IntelliJ IDEA 13.1.6 and Kotlin plugin 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 class, JavaInterface.java:

public interface JavaInterface {   public String getName(); } 

Kotlin class, KotlinClass.kt

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

I've tried overriding the 'getter' method by adding override fun getName(): String? = name, but that produces the same error.

I can see one workaround by doing this instead:

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

But in my real-world case I have a number of properties to implement and need setters too. Doing this for each property doesn't seem very Kotlin-ish. What am I missing?

like image 354
Michael Rush Avatar asked Mar 25 '15 23:03

Michael Rush


2 Answers

Making that variable private solves the problem.

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

like image 170
LKarma Avatar answered Sep 28 '22 03:09

LKarma


You could use @JvmField for instructs the compiler not generate getter/setter, and you can implement your setters and getters. With this your code work well in Java (as attribute getter/setter) and Kotlin as property

Example: 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")    } } 
like image 41
Renato Garcia Avatar answered Sep 28 '22 01:09

Renato Garcia