2012-07-11 12 views
16

Tengo un método por el que necesito pasar una enumeración como parámetro.Cómo declarar un parámetro de método como cualquier enumeración

public <T> T doSomething(SomeEnum operation, Class<T> something); 

Tengo varias enumeraciones y el método es muy común que debe funcionar con cualquier enumeraciones. ¿Cuál es la forma correcta de escribir esta firma de método para aceptar cualquier tipo de enumeración genérica? Sé que puedo usar una interfaz de marcador para este propósito, pero me gustaría escribirlo con firmas enum genéricas. Por favor, avísenme sobre esto.

¿Cuál es la mala idea con el siguiente: (Funciona, pero recibo advertencias de IDE diciendo que es un tipo sin procesar. No tengo claro el motivo).

public void doSomething(Enum operation); 

Respuesta

30
public <E extends Enum<E>> void doSomething(E operation); 

EDITAR: Un ejemplo de acuerdo a sus modificaciones:

public class Main { 

    public enum Day { 
     SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
     THURSDAY, FRIDAY, SATURDAY 
    } 

    public <E extends Enum<E>> E doSomething(E operation, Class<E> klazz) { 

     return operation; 
    } 

    public static void main(String[] args) { 

     new Main().doSomething(Day.FRIDAY, Day.class); 
    } 

} 

Edit2:

si necesita T y la enumeración como tipos separados, entonces tendrá que:

public <T, E extends Enum<E>> T doSomething(E operation, Class<T> klazz) { 
+0

Ese es el camino a seguir. Consulte también EnumSet para ver un ejemplo de esto en acción: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/EnumSet.html – Zarkonnen

+0

Hola, gracias por la respuesta, pero no pude. t agrega esta parte ya que nuevamente se queja de problemas de firma. Lamento haber publicado la firma exacta que estoy buscando. Por favor, vea mi edición en la firma de método existente a la que tengo que agregar lo que ha mencionado. En este caso, ¿cómo se verá la firma del método? – popcoder

+1

¿Es esto lo que estás buscando? o T y la enumeración deben ser tipos separados? –

10

Se podría hacer:

public void doSomething(final Enum<?> operation); 

que dice que tiene que ser una enumeración, pero no ninguno específico.

+0

Para aclarar: Esto simplemente elimina la advertencia (porque 'Enum' y' Enum 'son la misma cosa, pero una es explícita al respecto). –

+1

@BrendanLong: 'Enum' y' Enum 'no son lo mismo. p.ej. puede agregar cosas a una 'Lista', pero no puede agregar nada a una' Lista ' – newacct

0

Éste es más despejado:

public class EnumTest { 

    protected static <E extends Enum<E>> void enumValues(Class<E> enumData) { 
     for (Enum<E> enumVal: enumData.getEnumConstants()) { 
      System.out.println(enumVal.toString()); 
     } 
    } 

    public static enum TestEnum { 
     ONE, TWO, THREE; 
    } 

    public static void main(String param []) { 
     EnumTest.enumValues(EnumTest.TestEnum.class); 
    } 
} 
Cuestiones relacionadas