使用此代码:
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();
}
}
会导致编译时出错。是否有可能以某种方式检索泛型枚举的值?
答案 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
的用法:通常它是获取所有枚举常量的非常便宜的方法,因为它重用内部枚举常量数组而不是复制它。