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

And*_*eas 5 java enums interface kotlin

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

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

public interface Aspect {
   int index();
   String name();
}
Run Code Online (Sandbox Code Playgroud)

在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在Kotlin枚举类中尝试此操作,则会由于名称“名称”冲突而收到[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
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

asm*_*dey 1

据我所知,现在最适合您的选择如下:

\n\n
interface Aspect2: Aspect {\n  fun myName() = name()\n}\nenum class CollisionType : Aspect2 {\n  \xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

等等

\n