У меня есть объект класса для перечисления (у меня есть Class<? extends Enum>
), и мне нужно получить список перечисляемых значений, представленных этим перечислением. Статическая функция values
имеет то, что мне нужно, но я не уверен, как получить доступ к ней из объекта класса.
Переменные Java: перечисляет перечисленные значения из класса <? extends Enum>
Ответ 1
Ответ 2
Если вам известно имя требуемого значения:
Class<? extends Enum> klass = ...
Enum<?> x = Enum.valueOf(klass, "NAME");
Если вы этого не сделаете, вы можете получить массив из них (как Том добрался до первого):
klass.getEnumConstants();
Ответ 3
использовать отражение просто, как вызов Class # getEnumConstants():
List<Enum<?>> enum2list(Class<? extends Enum<?>> cls) {
return Arrays.asList(cls.getEnumConstants());
}
Ответ 4
Я EnumSet#allOf()
увидев, что 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