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

我有一个枚举的类对象(我有一个Class<? extends Enum> ),我需要得到这个枚举表示枚举值的列表。 values静态函数具有我所需要的,但我不知道如何从类对象访问它。

Class.getEnumConstants

如果你知道你需要的值的名字:

  Class<? extends Enum> klass = ... Enum<?> x = Enum.valueOf(klass, "NAME"); 

如果你不这样做,你可以通过(如汤姆先生)得到一系列的:

  klass.getEnumConstants(); 

使用reflection很简单,就像调用Class#getEnumConstants() :

 List<Enum> enum2list(Class<? extends Enum> cls) { return Arrays.asList(cls.getEnumConstants()); } 

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

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

创build一个包含指定元素types中所有元素的枚举集合。

考虑下面的enum

 enum MyEnum { TEST1, TEST2 } 

只需调用像这样的方法:

 Set<MyEnum> allElementsInMyEnum = EnumSet.allOf(MyEnum.class); 

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

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

 Class<? extends Enum> enumClass = MyEnum.class; Set<? extends Enum> allElementsInMyEnum = EnumSet.allOf(enumClass); 

Class#getEnumConstants()相比,此方法的优点在于它是键入的,因此不可能将其他任何东西传递给enum 。 例如,下面的代码是有效的,并返回null

 String.class.getEnumConstants(); 

虽然这不会编译:

 EnumSet.allOf(String.class); // won't compile