Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java中的枚举类型参数获取信息_Java_Generics_Enums - Fatal编程技术网

从Java中的枚举类型参数获取信息

从Java中的枚举类型参数获取信息,java,generics,enums,Java,Generics,Enums,我试图从通用Java类中访问任意枚举的属性。特别是,我想访问枚举中的值的数量以及实际值本身 这段(显然是愚蠢的)伪代码说明了以下意图: public class Test <E extends Enum>{ public enum TestEnum { FIRST, SECOND, THIRD } public Test() { System.out.println(E.values().length); //error -

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

这段(显然是愚蠢的)伪代码说明了以下意图:

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>();
    }
}
公共类测试{
公共枚举测试数{
一、二、三
}
公开考试(){
System.out.println(E.values().length);//错误-无法编译
}
公共静态void main(字符串[]args){
测试t=新测试();
}
}
对于StackOverflow上的类似问题,有一些解决方案,但它们需要修改枚举。在这里,代码适用于任意枚举非常重要

这在Java中可能吗

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


~Chris

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

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]
公共类测试{
公共枚举测试数{
一、二、三
}

公共测试(Class您可以使用反射和编译器在创建枚举时自动添加的静态值方法

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]
公共类测试{
公共枚举测试数{
一、二、三
}

公共测试(Class要在运行时访问E的实际类,应该在编译时显式地设置它

对于java类型擦除,将其设置为类型参数不起作用。 我刚刚编译了测试类,并为其运行了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
。。。
公共静态void main(java.lang.String[]);
代码:
0:new#2;//类测试
3:dup
4:invokespecial#3;//调用无参数构造函数“”:()V
7:astore_1//将对象引用存储到局部变量“t”
8:返回
所以,构造函数对TestEnum类型参数一无所知


最好的解决方案是将类参数作为传递给构造函数。

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

对于java类型擦除,将其设置为类型参数不起作用。 我刚刚编译了测试类,并为其运行了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
。。。
公共静态void main(java.lang.String[]);
代码:
0:new#2;//类测试
3:dup
4:invokespecial#3;//调用无参数构造函数“”:()V
7:astore_1//将对象引用存储到局部变量“t”
8:返回
所以,构造函数对TestEnum类型参数一无所知


最合适的解决方案是将类参数作为传递给构造函数。

您的代码没有任何意义。
Enum
是一个类型,您将它当作一个带有
E.values()
的实例来使用(忽略
Enum
甚至没有该方法)@BrianRoach:事实上,代码是有意义的,或者如果不使用泛型,至少会有意义。以下编译和运行很好:公共类示例{public enum examplenum{THIS,code,WORKS}public static void main(String[]args){System.out.println(examplenum.values().length)}(对不起,这里的格式都搞砸了)对,这就是我的意思。在Java中,当涉及到
Enum
类和
Enum
关键字时,枚举有点奇怪。实际上,您可以在类中设置一个字段:
E myEnum=(E)Test.TestEnum。首先;
然后执行
myEnum.getDeclaringClass().getEnumConstants()@BrianRoach:事实上,代码是有意义的,或者如果不使用泛型,至少会有意义。以下编译和运行很好:公共类示例{public enum examplenum{THIS,code,WORKS}public static void main(String[]args){System.out.println(examplenum.values().length)}(对不起,这里的格式都搞砸了)对,这就是我的意思。在Java中,当涉及到
Enum
类和
Enum
关键字时,枚举有点奇怪。实际上,您可以在类中设置一个字段:
E myEnum=(E)Test.TestEnum。首先;
然后执行
myEnum.getDeclaringClass().getEnumConstants()