Java - Можете ли вы получить доступ к Enum, объявленному в подклассе из класса Super? - PullRequest
0 голосов
/ 31 января 2010

Я надеялся объявить тип 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 ]

2 голосов
/ 31 января 2010

На самом деле вы можете вызывать статические методы для экземпляров, но получить экземпляр Enum таким способом невозможно. То есть эта строка не будет работать и каждый раз будет вызывать исключение InstantiationException.

Enum newEnum = enumClass.newInstance();

Это связано с тем, что перечисления имеют ограниченные значения, которые они могут иметь, и эти значения устанавливаются JVM при инициализации класса (Pets.CAT и Pets.DOG, в вашем примере).

2 голосов
/ 31 января 2010

values() - статический метод, его нельзя вызвать в экземпляре. Чтобы получить значения перечисления из класса, используйте Class.getEnumConstants():

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