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