Java: enum générique dans le paramètre de méthode

Correspond à la question suivante:

Java: paramètre Enum dans la méthode

Je voudrais savoir, comment puis-je formater le code pour exiger des énumérations génériquement.

Foo.java

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

Bar.java

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

Plus tard, j'aurai plus de classes enum comme "foo", mais vous pouvez toujours créer une barre contenant n'importe quel type de classe enum. J'ai "jdk1. 6. 0_20" en passant...

25
demandé sur Community 2010-12-01 17:24:00

3 réponses

Voir les méthodes dans EnumSet pour référence, par exemple

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

(cette méthode renvoie un EnumSet avec un élément d'un élément Enum donné E)

Donc, les limites génériques dont vous avez besoin sont: <E extends Enum<E>>


En fait, vous allez probablement rendre Bar lui-même générique:

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

    private final E item;

    public E getItem(){
        return item;
    }

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

, Vous pouvez également ajouter une méthode de fabrique, comme from, with etc.

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

De cette façon, dans le code client, il vous suffit d'écrire la signature Générique une fois:

// 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);

Référence:

33
répondu Sean Patrick Floyd 2010-12-01 15:27:51

Vous pouvez aussi le faire de cette façon:

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

Chaque énumération étend Enum. Ensuite, vous pouvez l'utiliser si vous avez besoin des constantes enum:

e.getDeclaringClass().getEnumConstants()
13
répondu André 2011-09-23 17:31:19
public class bar {
    public <E extends Enum<E>> void bar(E enumObject);
}

La méthode bar peut maintenant recevoir n'importe quel type d'énumération.

7
répondu gustafc 2010-12-01 14:28:35