从枚举类型和序号获取枚举值

8
public <E extends Enum> E decode(java.lang.reflect.Field field, int ordinal) {
    // TODO
}

假设field.getType().isEnum()true,我该如何生成给定序数的枚举值?

Field 不是枚举类型。我已经更新了问题以澄清这一点,尽管我认为从标签中应该很明显。 - Steve
4个回答

21
field.getType().getEnumConstants()[ordinal]

足够了。一行;足够直接。


@SteveTaylor 除了整个表达式在 FieldClass 的范围内之外,xD - Jai

4
ExampleTypeEnum value = ExampleTypeEnum.values()[ordinal]

2
请查看问题中的注释。 - Steve

3
要得到你想要的,你需要调用YourEnum.values()[ordinal]。你可以使用反射来实现它,代码如下:
public static <E extends Enum<E>> E decode(Field field, int ordinal) {
    try {
        Class<?> myEnum = field.getType();
        Method valuesMethod = myEnum.getMethod("values");
        Object arrayWithEnumValies = valuesMethod.invoke(myEnum);
        return (E) Array.get(arrayWithEnumValies, ordinal);
    } catch (NoSuchMethodException | SecurityException
            | IllegalAccessException | IllegalArgumentException
            | InvocationTargetException e) {
        e.printStackTrace();
    }
    return null;
}

更新

正如@LouisWasserman在他的评论中指出的那样,有更简单的方法。

public static <E extends Enum<E>> E decode(Field field, int ordinal) {
    return (E) field.getType().getEnumConstants()[ordinal];
}

是的,我认为我无法绕过执行return (Enum[])field.getType().getMethod("values").invoke(null))[ordinal]这样的操作。 - Steve
虽然这并不是非常重要,但类型应该是<E extends Enum<E>> - Bohemian
1
更简单的写法:field.getType().getEnumConstants()[ordinal] - Louis Wasserman
1
@LouisWasserman 如果您将您的评论移至答案,我会接受那个作为最佳答案。 - Steve

0

根据标题,建议

public <E extends Enum> E decode(Class<?> enumType, int ordinal) 
{
   return enumType.getEnumConstants()[ordinal];
}

被调用

YourEnum enumVal = decode(YourEnum.class, ordinal)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接