2010-12-01 3 views
23

Correspondig la question suivante:Java: ENUM générique dans le paramètre de la méthode

Java: Enum parameter in method

Je voudrais savoir, comment puis-je formater le code d'exiger é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, je vais avoir plus de classes de ENUM comme "foo", mais vous pouvez toujours créer barre contenant tout type de classe ENUM . J'ai "jdk1.6.0_20" en passant ...

Répondre

32

Voir les méthodes en 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)

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


En fait, vous allez probablement faire 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 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:

+0

Nous vous remercions de cet exemple, aussi absurde que la syntaxe est - que je lis que « PLACEHOLDER étend Enum de PLACEHOLDER » (vs juste « PLACEHOLDER étend Supertype "pour les non-enums" – Roboprog

6
public class bar { 
    public <E extends Enum<E>> void bar(E enumObject); 
} 

La méthode bar peut maintenant recevoir tout type de ENUM.

13

Vous pouvez aussi le faire de cette façon:

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

Chaque énumération étend Enum. Ensuite, vous pouvez utiliser si vous avez besoin des constantes de ENUM:

e.getDeclaringClass().getEnumConstants() 
Questions connexes