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" ...
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:
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()
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.