37

Correspondig the following question:

Java: Enum parameter in method

I would like to know, how can I format the code to require enums generically.

Foo.java

public enum Foo { 
    a(1), b(2);
}

Bar.java

public class Bar {
    public Bar(generic enum);
}

Later on I'll have more enum classes like "foo", but you can still create bar containing any kind of enum class. I have "jdk1.6.0_20" by the way...

3 Answers 3

50

See the methods in EnumSet for reference, e.g.

public static <E extends Enum<E>> EnumSet<E> of(E e)

(This method returns an EnumSet with one element from a given Enum element e)

So the generic bounds you need are: <E extends Enum<E>>


Actually, you will probably make Bar itself generic:

public class Bar<E extends Enum<E>> {

    private final E item;

    public E getItem(){
        return item;
    }

    public Bar(final E item){
        this.item = item;
    }
}

You may also add a factory method like from, with etc.

public static <E2 extends Enum<E2>> Bar<E2> with(E2 item){
    return new Bar<E2>(item);
}

That way, in client code you only have to write the generic signature once:

// e.g. this simple version
Bar<MyEnum> bar = Bar.with(MyEnum.SOME_INSTANCE);
// instead of the more verbose version:
Bar<MyEnum> bar = new Bar<MyEnum>(MyEnum.SOME_INSTANCE);

Reference:

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for that example, as nonsensical as the syntax is - which I am reading as "PLACEHOLDER extends Enum of PLACEHOLDER" (vs just "PLACEHOLDER extends SuperType" for non-enums)
18

You can also do it this way:

public class Bar {
    public Bar(Enum<?> e){}
}

Every enumeration extends Enum. Then you can use this if you need the enum constants:

e.getDeclaringClass().getEnumConstants()

1 Comment

While this isn't using generics like OP asked, this answer will likely provide a simple solution to many people's problems without needing a generic to begin with!
10
public class bar {
    public <E extends Enum<E>> void bar(E enumObject);
}

The bar method can now receive any kind of enum.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.