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

时间:2021-05-21 12:39:16

标签: java generics java-8 enums

我有两个枚举如下

第一

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

3 个答案:

答案 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
}