Java - 你能从Super类访问Subclass中声明的Enum吗?

时间:2010-01-30 21:20:43

标签: java generics enums abstract-class

我希望在子类中声明Enum类型,然后从超类中访问它。这就是我提出的,但它不起作用:

class Subclass {
 enum Pets {
  CAT,
  DOG;
 }

Class<Pets> getEnumClass() {
    return Pets.class;
 }
}

class Superclass  {
    // This generates a warning: 
abstract Class<? extends Enum> getEnumClass(); 
void PrintEnumNames() throws InstantiationException, IllegalAccessException {
Class<? extends Enum> enumClass = getEnumClass();

Enum newEnum = enumClass.newInstance();
 for( Enum iEnum : newEnum.values()) { // newEnum.values() isn't available
    System.out.printf("%s", iEnum.toString());
   }
 }
}

2 个答案:

答案 0 :(得分:2)

values()是一个静态方法,你无法在实例上调用它。要从类中获取枚举值,请使用Class.getEnumConstants()

Class<? extends Enum> enumClass = getEnumClass(); 
for (Object o: enumClass.getEnumConstants())
    System.out.println(o);

答案 1 :(得分:2)

实际上,您可以在实例上调用静态方法,但是不可能以这种方式获取Enum的实例。也就是说,这一行不起作用,每次都会抛出一个InstantiationException。

Enum newEnum = enumClass.newInstance();

这是因为Enums受限于它们可以拥有的值,并且这些值是在初始化类时由JVM设置的(在您的示例中为Pets.CAT和Pets.DOG)。