0

我正在尝试从通用 Java 类中访问任意 Enum 的属性。特别是,我想访问 Enum 中值的数量以及实际值本身。

这个(显然是愚蠢的)虚拟代码说明了意图:

public class Test <E extends Enum>{
    public enum TestEnum {
        FIRST, SECOND, THIRD
    }
    public Test() {
        System.out.println(E.values().length);   //error - won't compile
    }
    public static void main(String[] args) {
        Test<TestEnum> t = new Test<TestEnum>();
    }
}

StackOverflow 上有类似问题的一些解决方案,但它们需要修改 Enum。重要的是,代码适用于任意Enum。

这在Java中甚至可能吗?

提前感谢您提供任何可能的建议。

〜克里斯

4

2 回答 2

3

您可以使用反射和编译器在创建枚举时自动添加的静态值方法。

public class Test {

    public enum TestEnum {
        FIRST, SECOND, THIRD
    }

    public Test(Class<? extends Enum> enumType) throws IllegalAccessException,
            InstantiationException, NoSuchMethodException,
            InvocationTargetException {
        Enum[] values = (Enum[]) enumType.getDeclaredMethod("values").invoke(
            null);
        System.out.println(Arrays.toString(values));
    }

    public static void main(String[] args) throws InstantiationException,
            IllegalAccessException, InvocationTargetException,
            NoSuchMethodException {
        Test t = new Test(Test.TestEnum.class);
    }
}


>> [FIRST, SECOND, THIRD]
于 2013-02-09T04:02:54.717 回答
0

要在运行时访问 E 的实际类,它应该在编译时明确设置。

将其设置为类型参数不起作用,因为 java 类型擦除。我刚刚编译了 Test 类,并为它运行 javap:

...
public static void main(java.lang.String[]);
  Code:
   0:   new #2; //class Test
   3:   dup
   4:   invokespecial   #3; //call no-arg constructor "<init>":()V
   7:   astore_1            // store object reference to local variable 't'
   8:   return

因此,构造函数对 TestEnum 类型参数一无所知。

最合适的解决方案是像@stampy88 所写的那样将类参数传递给构造函数。

于 2013-02-09T05:58:30.513 回答