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

Как написать генератор для цикла для Java Enum?

Есть ли способ написать общий цикл для итерации по произвольному Enum? Например:

public static void putItemsInListBox(Enum enum, ListBox listbox){
    for(Enum e : enum.values(){
        listBox.addItem(e.toString(), String.valueOf(e.ordinal());
    }
}

Вы не можете сделать это, потому что класс Enum не имеет метода, называемого значениями(), как и реализованные классы Enum. Вышеупомянутый для цикла отлично работает для класса, который определяется как перечисление.

4b9b3361

Ответ 1

Он работает точно так же, как если бы передавался Class:

public static <E extends Enum<?>> void iterateOverEnumsByInstance(E e)
{
    iterateOverEnumsByClass(e.getClass());
}

public static <E extends Enum<?>> void iterateOverEnumsByClass(Class<E> c)
{
    for (E o: c.getEnumConstants()) {
        System.out.println(o + " " + o.ordinal());
    }
}

Использование:

enum ABC { A, B, C }
...
iterateOverEnumsByClass(ABC.class);
iterateOverEnumsByInstance(ABC.A);

Ответ 2

Это дешево, но должно работать (по крайней мере, согласно моему тестированию):

public static <T extends Enum<T>> void putItemsInListBox(Class<T> cls, ListBox listbox) {
    for (T item : EnumSet.allOf(cls))
        listbox.addItem(item.toString(), String.valueOf(item.ordinal()));
}

Это работает, потому что EnumSet имеет специальный магический доступ к непубличным членам Enum, который позволяет ему перечислять значения перечисления, несмотря на отсутствие метода values.