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

如何为Java枚举编写通用for循环?,java,for-loop,enums,Java,For Loop,Enums,有没有一种方法可以编写泛型循环来迭代任意枚举? 例如: public static void putItemsInListBox(Enum enum, ListBox listbox){ for(Enum e : enum.values(){ listBox.addItem(e.toString(), String.valueOf(e.ordinal()); } } 您不能执行上述操作,因为Enum类不像实现的Enum类那样具有名为values()的方法。上面的

有没有一种方法可以编写泛型循环来迭代任意枚举? 例如:

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循环对于定义为enum的类很有效。

这很便宜,但应该可以工作(至少根据我的测试):

公共静态无效putItemsInListBox(类cls,ListBox ListBox){
对于(T项:EnumSet.allOf(cls))
addItem(item.toString(),String.valueOf(item.ordinal());
}

这是因为
EnumSet
Enum
的非公共成员具有特殊的魔法访问权限,允许它枚举枚举值,尽管没有
values
方法。

它的工作方式与传递
类的方式完全相同:

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

这不是魔法。每个枚举类型
T
都有一个公共静态方法
T[]T.values()
EnumSet
使用反射来访问它,但它不需要特殊权限。@finnw:它不使用反射!(参见
EnumSet.getUniverse
的实现)它使用了非常类似@axtavt的答案(
getenumstants
),但以一种更神奇的方式(
SharedSecrets.getJavaLangAccess().getEnumConstantsShared
)。无论如何,axtavt的答案比我的好,所以我鼓励大家投赞成票-P+1谢谢,我学到了一些关于如何访问枚举成员的新知识!我喜欢这个答案,尽管我想稍微修改一下方法签名,签名应该是:publicstatic>voiditerateoverenumsbyclass(Class c),因为您想要一组枚举而不是枚举,我建议传入
Iterable
或类似的东西。
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);