2009-10-26 186 views
49

我有一个枚举的类对象(我有一个Class<? extends Enum>),我需要得到这个枚举表示枚举值的列表。 values静态函数具有我所需要的,但我不确定如何从类对象访问它。使用Java枚举:列出Class <?中的枚举值扩展枚举>

+0

其静态 - 反射。 – IAdapter 2009-10-26 19:40:43

+0

'Class'是一个反射对象(它在包之前)。 – 2009-10-26 19:56:05

回答

10

反射是简单的调用Class#getEnumConstants()

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

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

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

如果不这样做,你可以通过(如Tom得到的第一个)得到他们的数组:

 klass.getEnumConstants(); 
3

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

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

创建包含所有在指定元素类型的元素的枚举集。

考虑以下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