Подтвердить что ты не робот

Переменные Java: перечисляет перечисленные значения из класса <? extends Enum>

У меня есть объект класса для перечисления (у меня есть Class<? extends Enum>), и мне нужно получить список перечисляемых значений, представленных этим перечислением. Статическая функция values имеет то, что мне нужно, но я не уверен, как получить доступ к ней из объекта класса.

4b9b3361

Ответ 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