Ответ 1
Ваш лучший вариант - это, вероятно, передать Class
желаемого перечисления конструктору. (См., Например, как EnumMap
).
Затем вы можете использовать clazz.
getEnumConstants
()
, чтобы получить константы.
Я пытаюсь инициализировать общий класс со всеми доступными значениями из Enum. Я бы хотел, чтобы он работал:
public class MyClass<E extends Enum<E>> {
E[] choices;
public MyClass() {
choices = E.values();
}
Однако вызов в E.values
не принят в Eclipse, говоря, что этот метод undefined для этого E.
Использование этого конструктора вместо этого принято, но требует, чтобы вызывающий вызывал следующие значения:
public MyClass(E[] e) {
choices = e;
}
В документации я нашел:
Типы перечисления языка программирования Java намного мощнее, чем их коллег на других языках. Объявление enum определяет класс (называемый типом перечисления). Тело класса enum может включать методы и другие поля. Компилятор автоматически добавляет некоторые специальные методы когда он создает перечисление. Например, они имеют метод статических значений который возвращает массив, содержащий все значения перечисления в которые они объявлены.
Есть ли способ обхода этой проблемы?
Ваш лучший вариант - это, вероятно, передать Class
желаемого перечисления конструктору. (См., Например, как EnumMap
).
Затем вы можете использовать clazz.
getEnumConstants
()
, чтобы получить константы.
Ваш первый фрагмент кода не работает из-за того, как Generics реализуется на Java и из-за явления, известного как type erasure. Из-за этого JVM не знает, что такое тип E
, когда ваша программа выполняется.
Возможно, вы могли бы сделать что-то подобное в конструкторе MyClass
:
public MyClass(E type) {
choices = type.getDeclaringClass().getEnumConstants();
}