在Java中给定以下enum,将Int类型转换为enum的正确方法是什么?

public enum MyEnum
{
    EnumValue1,
    EnumValue2
}


MyEnum enumValue = (MyEnum) x; //Doesn't work???

当前回答

尝试myenumn .values()[x],其中x必须为0或1,即枚举的有效序数。

注意,在Java中枚举实际上是类(enum值因此是对象),因此您不能将int甚至Integer强制转换为enum。

其他回答

Use MyEnum enumValue = MyEnum.values()[x];

Java枚举没有c++中那样的枚举到int的映射。

也就是说,所有枚举都有一个values方法,返回可能的枚举值数组,所以

MyEnum enumValue = MyEnum.values()[x];

应该工作。这有点讨厌,如果可能的话,最好不要尝试从int转换为enum(反之亦然)。

为了帮助其他人,我更喜欢的选项(这里没有列出)使用了Guava的地图功能:

public enum MyEnum {
    OPTION_1(-66),
    OPTION_2(32);

    private int value;
    private MyEnum(final int value) {
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }

    private static ImmutableMap<Integer, MyEnum> reverseLookup = 
            Maps.uniqueIndex(Arrays.asList(MyEnum.values())), MyEnum::getValue);

    public static MyEnum fromInt(final int id) {
        return reverseLookup.getOrDefault(id, OPTION_1);
    }
}

在默认情况下,你可以使用null,你可以抛出IllegalArgumentException或者你的fromInt可以返回一个Optional,无论你喜欢什么行为。

enum MyEnum {
    A(0),
    B(1);
    private final int value;
    private MyEnum(int val) {this.value = value;}
    private static final MyEnum[] values = MyEnum.values();//cache for optimization
    public static final getMyEnum(int value) { 
        try {
            return values[value];//OOB might get triggered
        } catch (ArrayOutOfBoundsException e) {
        } finally {
            return myDefaultEnumValue;
        }
    }
}

你可以这样试试。 用元素id创建Class。

      public Enum MyEnum {
        THIS(5),
        THAT(16),
        THE_OTHER(35);

        private int id; // Could be other data type besides int
        private MyEnum(int id) {
            this.id = id;
        }

        public static MyEnum fromId(int id) {
                for (MyEnum type : values()) {
                    if (type.getId() == id) {
                        return type;
                    }
                }
                return null;
            }
      }

现在使用id作为int来获取这个Enum。

MyEnum myEnum = MyEnum.fromId(5);