Kotlin枚举用String name()声明实现Java接口

时间:2017-12-16 18:55:45

标签: java enums interface kotlin

我有一个Kotlin项目,我使用Java库依赖项来定义一个带有String name()方法声明的接口。

在Java中,我能够在枚举声明中使用此接口,其中String name()方法由枚举隐式实现。

public interface Aspect {
   int index();
   String name();
}

在Java中,这是可能的:

public enum CollisionType implements Aspect {
    ONE, TWO, THREE;

    private final Aspect aspect;
    private CollisionType() {
        aspect = CONTACT_ASPECT_GROUP.createAspect(name());
    }
    @Override
    public int index() {
        return aspect.index();
    }
}

如果我在Kotlin枚举类中尝试此操作,则会因为名称“name”冲突而出现[CONFLICTING INHERITED JVM DECLARATIONS]错误。 我试图使用@JvmName注释来定义一个不同的名称,因为它建议通过这种问题来做,但我无法正确使用它来解决这个问题。

enum class CollisionType : Aspect {
    ONE, TWO, TREE;
    val aspect: Aspect = CONTACT_TYPE_ASPECT_GROUP.createAspect(name())

    override fun index(): Int = aspect.index()
    @JvmName("aspectName")
    override fun name(): String = name
}

给出错误:“@JvmName注释不适用于此声明”

是否有可能在Kotlin的枚举类中实现/使用定义String name()方法的给定Java接口?

由于

1 个答案:

答案 0 :(得分:0)

据我所知,现在最好的选择是:

interface Aspect2: Aspect {
  fun myName() = name()
}
enum class CollisionType : Aspect2 {
  ………
}

等等