2010-01-30 4 views
0

J'espérais déclarer en type Enum dans une sous-classe et y accéder à partir de la super classe. C'est ce que je suis venu avec, mais il ne fonctionne pas:Java - Pouvez-vous accéder à une Enum déclarée dans la sous-classe de la classe Super?

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()); 
    } 
} 
} 

Répondre

2

values() est une méthode statique, vous ne pouvez pas l'appeler sur l'instance. Pour obtenir des valeurs de ENUM de la classe, utilisez Class.getEnumConstants():

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

En fait, vous pouvez appeler des méthodes statiques sur des instances, mais il est impossible d'obtenir une instance d'un Enum de cette façon. Autrement dit, cette ligne ne fonctionnera pas et lancera une InstantiationException à chaque fois.

Enum newEnum = enumClass.newInstance(); 

Ceci est parce que énumérations sont limitées dans les valeurs qu'ils peuvent avoir, et ces valeurs sont définies par la machine virtuelle Java lorsque la classe est initialisée (Pets.CAT et Pets.DOG, dans votre exemple).