将一种枚举类型转换为另一种枚举类型的通用方法

我有两个枚举如下

第一的

public enum firstEnum {
    ALL_PRODUCT,
    SPECIFIC_COLLECTION,
    SPECIFIC_PRODUCT
}

第二

public enum secondEnum {
    PRODUCT,
    COLLECTION,
    PRODUCT
}

我正在尝试创建一个通用方法来将一种类型转换为另一种类型,如下所示

public record EnumCasting() {
    public <E1,E2> E2 CastOneEnumToAnother(E1 enumFirst, E2 enumSecond) {
         return // some logic to convert
    }
}

不知道我怎么能做到这一点,任何帮助将不胜感激。 firstEnum.ALL_Product should return secondEnum.Product, firstEnum.SPECIFIC_COLLECTION should return secondEnum.COLLECTION

回答

这是一种方法。

interface MappableEnum<E> { 
    E counterpart();
}

enum E1 {
    A, B, C;
}

enum E2 implements MappableEnum<E1> {
    AA(E1.A), BB(E1.B), CC(E1.C);

    private final E1 counterpart;

    E2(E1 counterpart) { this.counterpart = counterpart; }

    E1 counterpart() { return counterpart; }
}

如果您想拥有来自同一个枚举的多个映射,您可以使用EnumMap<E1, E2>来捕获映射。构建EnumMap在E1的使用相同的技术构造。这样,枚举之间的映射是明确的。

正如另一个答案所建议的那样,试图根据序数隐式地进行映射是一个痛苦的世界。如果有人询问错误的一对枚举,当一个枚举的常量多于另一个时,您将得到一个垃圾答案或一个异常。即使他们正确使用它,如果有人后来将一个新的枚举常量插入其中,而没有将其插入另一个的正确位置,那么您的代码就会被破坏。

如果你想进行这种映射,这两个类是耦合的,你必须在某个地方捕获这种耦合,要么在类型系统 ( implements) 中,要么作为显式初始化的数据 ( EnumMap)。


以上是将一种枚举类型转换为另一种枚举类型的通用方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>