简体   繁体   English

如何为Java Enum编写泛型for循环?

[英]How do I write a generic for loop for a Java Enum?

Is there a way to write a generic loop to iterate over an arbitrary Enum? 有没有办法编写一个通用循环迭代任意枚举? For example: 例如:

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

You can not do the above, because the Enum class does not have a method called values() like the implemented Enum classes. 您无法执行上述操作,因为Enum类没有像实现的Enum类那样的名为values()的方法。 The above for loop works fine for a class that is defined as an enum. 上面的for循环适用于定义为枚举的类。

It works exactly the same way as if the Class is passed: 它的工作方式与传递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());
    }
}

Usage: 用法:

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

This is cheap, but should work (at least according to my testing): 这很便宜,但应该有效(至少根据我的测试):

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

This works because EnumSet has special magical access to non-public members of Enum , which allows it to enumerate the enum's values despite the lack of a values method. 这是有效的,因为EnumSetEnum非公共成员具有特殊的神奇访问权限,这使得它可以枚举枚举值,尽管缺少values方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM