如何为 Java 枚举编写通用 for 循环?

2022-09-04 07:54:47

有没有办法编写一个泛型循环来迭代任意枚举?例如:

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

您不能执行上述操作,因为 Enum 类没有像实现的 Enum 类那样名为 values() 的方法。上面的 for 循环对于定义为枚举的类工作正常。


答案 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()));
}

这是有效的,因为对 的非公共成员具有特殊的魔法访问,这允许它枚举枚举枚举的值,尽管缺少方法。EnumSetEnumvalues