Java枚举:列出类<?的枚举值 扩展Enum>

Lan*_*uhn 67 java enums

我有一个枚举的类对象(我有一个Class<? extends Enum>),我需要得到这个枚举所代表的枚举值的列表.该values静态函数有我需要什么,但我不知道怎么去从类对象访问它.

Yis*_*hai 19

如果您知道所需值的名称:

     Class<? extends Enum> klass = ... 
     Enum<?> x = Enum.valueOf(klass, "NAME");
Run Code Online (Sandbox Code Playgroud)

如果你不这样做,你可以得到它们的数组(当汤姆得到第一个):

     klass.getEnumConstants();
Run Code Online (Sandbox Code Playgroud)


dfa*_*dfa 11

使用反射很简单,因为调用Class#getEnumConstants():

List<Enum<?>> enum2list(Class<? extends Enum<?>> cls) {
   return Arrays.asList(cls.getEnumConstants());
}
Run Code Online (Sandbox Code Playgroud)


Mag*_*lex 6

我很惊讶地看到EnumSet#allOf()没有提到:

public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)

创建一个包含指定元素类型中所有元素的枚举集.

请考虑以下事项enum:

enum MyEnum {
  TEST1, TEST2
}
Run Code Online (Sandbox Code Playgroud)

只需调用这样的方法:

Set<MyEnum> allElementsInMyEnum = EnumSet.allOf(MyEnum.class);
Run Code Online (Sandbox Code Playgroud)

当然,这会返回a Set,而不是a List,但在许多(大多数?)用例中它应该足够了.

或者,如果你有一个未知的enum:

Class<? extends Enum> enumClass = MyEnum.class;
Set<? extends Enum> allElementsInMyEnum = EnumSet.allOf(enumClass);
Run Code Online (Sandbox Code Playgroud)

Class#getEnumConstants()与之相比,这种方法的优点在于它被打字,因此不可能传递除了它之外的任何东西enum.例如,以下代码有效并返回null:

String.class.getEnumConstants();
Run Code Online (Sandbox Code Playgroud)

虽然这不会编译:

EnumSet.allOf(String.class); // won't compile
Run Code Online (Sandbox Code Playgroud)