Search code examples
javagenericsinterfaceenums

How to implement enum with generics?


I have a generic interface like this:

interface A<T> {
    T getValue();
}

This interface has limited instances, hence it would be best to implement them as enum values. The problem is those instances have different type of values, so I tried the following approach but it does not compile:

public enum B implements A {
    A1<String> {
        @Override
        public String getValue() {
            return "value";
        }
    },
    A2<Integer> {
        @Override
        public Integer getValue() {
            return 0;
        }
    };
}

Any idea about this?


Solution

  • You can't. Java doesn't allow generic types on enum constants. They are allowed on enum types, though:

    public enum B implements A<String> {
      A1, A2;
    }
    

    What you could do in this case is either have an enum type for each generic type, or 'fake' having an enum by just making it a class:

    public class B<T> implements A<T> {
        public static final B<String> A1 = new B<String>();
        public static final B<Integer> A2 = new B<Integer>();
        private B() {};
    }
    

    Unfortunately, they both have drawbacks.