将一种枚举类型转换为另一种枚举类型的通用方法
我有两个枚举如下
第一的
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)。