2010-12-01 26 views
23

correspondig la siguiente pregunta:Java: enumeración genérica en el parámetro método

Java: Enum parameter in method

Me gustaría saber, ¿cómo puedo formatear el código para requerir enumeraciones de forma genérica.

Foo.java

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

Bar.java

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

Más adelante voy a tener más clases de enumeración como "foo", pero todavía se puede crear barras que contiene cualquier tipo de clase de enumeración . Por cierto, tengo "jdk1.6.0_20" ...

Respuesta

32

Consulte los métodos en EnumSet para referencia, p.

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

(Este método devuelve un EnumSet con un elemento de un determinado Enum elemento e)

Así que los límites genéricos que necesita son: <E extends Enum<E>>


En realidad, es probable que Bar sí mismo genérico:

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

    private final E item; 

    public E getItem(){ 
     return item; 
    } 

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

También puede añadir un método de fábrica como from, etc. with

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

De esta manera, en el código de cliente solo tiene que escribir la firma genérica vez:

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

Referencia:

+0

gracias por esa ejemplo, como sin sentido ya que la sintaxis es - lo que estoy leyendo como "PLACEHOLDER extiende Enumeración de PLACEHOLDER" (vs simplemente "PLACEHOLDER extiende supertipo "para no-enums) – Roboprog

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

El método bar ahora pueden recibir cualquier tipo de enumeración.

13

También puede hacerlo de esta manera:

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

Cada enumeración se extiende Enum. A continuación, puede utilizar esta opción si necesita las constantes de enumeración:

e.getDeclaringClass().getEnumConstants() 
Cuestiones relacionadas