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

Используйте Enum.values ​​внутри с общим классом, расширяющим Enum

Я пытаюсь инициализировать общий класс со всеми доступными значениями из 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 может включать методы и другие поля. Компилятор автоматически добавляет некоторые специальные методы когда он создает перечисление. Например, они имеют метод статических значений который возвращает массив, содержащий все значения перечисления в которые они объявлены.

Есть ли способ обхода этой проблемы?

4b9b3361

Ответ 1

Ваш лучший вариант - это, вероятно, передать Class желаемого перечисления конструктору. (См., Например, как EnumMap).

Затем вы можете использовать clazz. getEnumConstants (), чтобы получить константы.

Ответ 2

Ваш первый фрагмент кода не работает из-за того, как Generics реализуется на Java и из-за явления, известного как type erasure. Из-за этого JVM не знает, что такое тип E, когда ваша программа выполняется.

Возможно, вы могли бы сделать что-то подобное в конструкторе MyClass:

public MyClass(E type) {
    choices = type.getDeclaringClass().getEnumConstants();
}