Reputation: 7423
I need to specify an Enum class as a class variable in another Enum like so:
enum A {}
enum B {
Class<Enum> clazz;
}
So that clazz can point to any Enum class like A or B or any other. Is it possible to do it in Java?
Upvotes: 2
Views: 1237
Reputation: 338336
Declare a member field:
public Class< ? extends Enum > clazz ;
Apparently yes, you can hold a enum Class
object as a member field on another enum’s class definition.
In this example code we define our own enum, Animal
, providing for two named instances. Our enum carries a member field of type Class
. In that member field, we store either of two enum classes passed to the constructor. We pass enum classes defined in the java.time package, DayOfWeek
amd Month
.
enum Animal {
// Instances.
DOG( DayOfWeek.class ) , CAT( Month.class ) ;
// Member fields.
final public Class clazz ;
// Constructor
Animal( Class c ) {
this.clazz = c ;
}
}
Access that member field.
System.out.println( Animal.CAT.clazz.getCanonicalName() ) ;
Run this code live at IdeOne.com.
java.time.Month
If you want to restrict your member field to hold only Class
objects that happen to be enums, use Java Generics. Enums in Java are all, by definition, implicitly subclasses of Enum
.
enum Animal {
DOG( DayOfWeek.class ) , CAT( Month.class ) ;
final public Class< ? extends Enum > clazz ;
Animal( Class< ? extends Enum > c ) {
this.clazz = c ;
}
}
In that code above, change the Month.class
to ArrayList.class
to get a compiler error. We declared our clazz
member field as holding a Class
object representing a class that is a subclass of Enum
. The Month
class is indeed a subclass of Enum
while ArrayList.class
is not.
Run that code with generics live at IdeOne.com.
Upvotes: 2