【发布时间】:2010-12-10 06:13:23
【问题描述】:
我有一个枚举的类对象(我有一个Class<? extends Enum>),我需要得到这个枚举表示的枚举值的列表。 values 静态函数有我需要的,但我不确定如何从类对象中访问它。
【问题讨论】:
-
它的静态 - 反射。
-
Class是一个反射对象(它早于包)。
我有一个枚举的类对象(我有一个Class<? extends Enum>),我需要得到这个枚举表示的枚举值的列表。 values 静态函数有我需要的,但我不确定如何从类对象中访问它。
【问题讨论】:
Class 是一个反射对象(它早于包)。
【讨论】:
如果你知道你需要的值的名称:
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)
创建一个枚举集,其中包含指定元素类型中的所有元素。
考虑以下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
【讨论】:
EnumSet 使用存储在 long 中的“位向量”。