web-dev-qa-db-fra.com

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

Correspondig la question suivante:

Java: paramètre Enum dans la méthode

J'aimerais savoir comment formater le code pour exiger des énumérations de manière générique.

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 d'ailleurs "jdk1.6.0_20" ...

28
Ed Michel

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

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)

Les limites génériques dont vous avez besoin sont donc: <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 d'usine 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, vous ne devez écrire la signature générique qu'une seule 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:

37
Sean Patrick Floyd

Vous pouvez également 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()
14
André
public class bar {
    public <E extends Enum<E>> void bar(E enumObject);
}

La méthode bar peut désormais recevoir tout type d'énumération.

8
gustafc