Laurent Pireyn
Laurent Pireyn

Reputation: 6875

In Kotlin, how can I work around the inherited declarations clash when an enum class implements an interface?

I define an enum class that implements Neo4j's RelationshipType:

enum class MyRelationshipType : RelationshipType {
    // ...
}

I get the following error:

Inherited platform declarations clash: The following declarations have the same JVM signature (name()Ljava/lang/String;): fun <get-name>(): String fun name(): String

I understand that both the name() method from the Enum class and the name() method from the RelationshipType interface have the same signature. This is not a problem in Java though, so why is it an error in Kotlin, and how can I work around it?

Upvotes: 11

Views: 1558

Answers (2)

R&#252;diger Schulz
R&#252;diger Schulz

Reputation: 3108

The example above is working with an interface having a property name instead of a function name().

interface Name {
    val name: String;
}

enum class Color : Name {
    Blue
}

Upvotes: 0

holi-java
holi-java

Reputation: 30696

it is a bug-KT-14115 even if you makes the enum class implements the interface which contains a name() function is denied.

interface Name {
    fun name(): String;
}


enum class Color : Name;
       //   ^--- the same error reported

BUT you can simulate a enum class by using a sealed class, for example:

interface Name {
    fun name(): String;
}


sealed class Color(val ordinal: Int) : Name {
    fun ordinal()=ordinal;
    override fun name(): String {
        return this.javaClass.simpleName;
    }
    //todo: simulate other methods ...
};

object RED : Color(0);
object GREEN : Color(1);
object BLUE : Color(2);

Upvotes: 14

Related Questions