我有两个枚举如下
第一
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
答案 0 :(得分:1)
我认为 TacheDeChoco 走在正确的轨道上,但他错过了必要的泛型声明。另外,由于泛型是通过类型擦除实现的,所以需要传入第二个枚举类型的类。
假设映射策略就像“将相应的枚举值放在完全相同的位置”一样简单,以下可能适用于工作:
public record EnumCaster() {
public static <E1 extends Enum<E1>, E2 extends Enum<E2>> E2 CastOneEnumToAnother(E1 input, Class<E2> e2) {
int pos = input.ordinal();
return e2.getEnumConstants()[pos];
}
public static void main(String[] args) {
System.out.println(firstEnum.ALL_PRODUCT);
System.out.println(CastOneEnumToAnother(firstEnum.ALL_PRODUCT, secondEnum.class));
}
}
答案 1 :(得分:0)
假设映射策略就像“将对应的枚举值放在完全相同的位置”一样简单,以下可能适用于工作:
public record EnumCasting() {
public <E1 extends Enum<E1>, E2 extends Enum<E2>> E2 CastOneEnumToAnother(
E1 input, Class<? extends E2> e2Class) {
int pos = input.ordinal();
return e2Class.getEnumConstants()[pos];
}
}
答案 2 :(得分:0)
考虑到需要返回第二个Enum相同位置的值,可以试试这个:
public class Main {
public static void main(String[] args) throws Exception {
SecondEnum selectedEnum = castOneEnumToAnother(FirstEnum.ALL_PRODUCT, SecondEnum.values()); // ok
System.out.println("Selected enum: " + selectedEnum);
selectedEnum = castOneEnumToAnother(FirstEnum.SPECIFIC_PRODUCT, SecondEnum.values()); //exception
System.out.println("Selected enum: " + selectedEnum);
}
public static <E1 extends Enum<E1>, E2 extends Enum<E2>> E2 castOneEnumToAnother(E1 enumInput, E2[] enumValues) throws Exception {
int pos = enumInput.ordinal();
if (pos >= enumValues.length) {
throw new Exception("Not found value in position " + pos + " for " + enumValues[0].getDeclaringClass().getSimpleName());
}
return enumValues[pos];
}
}
enum FirstEnum {
ALL_PRODUCT, SPECIFIC_COLLECTION, SPECIFIC_PRODUCT
}
enum SecondEnum {
PRODUCT, COLLECTION //, PRODUCT
}