如何遍历通用枚举的值?

时间:2015-07-12 09:33:31

标签: java generics enums

使用此代码:

var Blade = SKSpriteNode(imageNamed: "Blade.png") 

在通用枚举上调用enum MyEnum { A(1, 2), B(3, 4); private final int a; private final int b; MyEnum(int a, int b) { this.a = a; this.b = b; } } class GetValuesFromEnum<E extends Enum<E>> { public void printValues() { // This causes "cannnot find symbol" error during compilation for (E value : E.values()) { System.out.println(value); } } } public class Main { public static void main(String[] args) { new GetValuesFromEnum<MyEnum>().printValues(); } } 会导致编译时出错。是否有可能以某种方式检索泛型枚举的值?

2 个答案:

答案 0 :(得分:3)

除了@Tagir Valeev的回答之外,另一种在运行时检索枚举值的方法是通过java.lang.Class.getEnumConstants()方法

public void printValues(Class<? extends Enum<?>> enumCls) {
    for(Object obj: enumCls.getEnumConstants()) {
        System.out.println(obj);
    }   
}

答案 1 :(得分:2)

您可以通过以下方式修改代码:

class GetValuesFromEnum<E extends Enum<E>> {
    private Class<E> clazz;

    public GetValuesFromEnum(Class<E> clazz) {
        assert clazz.isEnum();
        this.clazz = clazz;
    }

    public void printValues() {
        for (E value : EnumSet.allOf(clazz)) {
            System.out.println(value);
        }

    }
}

public class Main {
    public static void main(String[] args) {
        new GetValuesFromEnum<>(MyEnum.class).printValues();
    }
}

为了能够在运行时访问枚举值,您应该知道运行时中的类(例如,将Class对象存储在字段中)。由于擦除,通用参数不够。还要注意EnumSet.allOf的用法:通常它是获取所有枚举常量的非常便宜的方法,因为它重用内部枚举常量数组而不是复制它。