2012-07-15 13 views
6

Suponiendo que tengo una enumeración básica como:Java: genéricos aceptar sólo los tipos de enumeración

public enum Color { Red, Green, Blue} 

¿Cómo se puede escribir una clase genérica que sólo acepta "clases de enumeración" de modo que una instanciación concreta de esa clase genérica podría parece MyClass<Color>?

Editar:

Qué realmente queremos hacer es escribir una clase abstracta genérico que contiene una función que devuelve todas las "entradas" de enumeración como lista:

public abstract class EnumListBean<E extends Enum<E>> { 

    public List<E> getEnumList() { 
     return Arrays.asList(E.values()); 
    } 

} 

Mientras Day.values() está disponible E.values() es no. ¿Qué estoy haciendo mal aquí?

+0

Sin su implementación no debería limitarse a un solo tipo de enumeración concreta, pero a tipos de enumeración arbitrarias. Acabo de usar 'Day' para describir más concretamente lo que quiero. – Paranaix

Respuesta

5
public class EnumAcceptor<E extends Enum<E>> { 
    ... 
} 

Uso E como un tipo dentro de su clase.

1

Un enum realmente declara una clase derivada de Enum. Como tal, puede utilizar:

public class MyClass<T extends Enum> { } 
+2

Está mezclando genéricos y tipos crudos. –

4

Ver Istvan Devai para la respuesta a la pregunta original.

Para el seguimiento, los métodos como values() son métodos estáticos, por lo que está de suerte tratando de obtener eso de un parámetro genérico. Como una solución pobre, puede pasar el objeto Class de la enum al constructor. y use Class.getEnumConstants. Pero también podría pasar MyEnum.values() en el constructor en lugar de la clase, y así evitar la reflexión por completo. Es una verdadera lástima que no haya una metaclase enum sensible.

0

Tenga en cuenta que la solución de @ Istvan solo puede aceptar elementos del enum, lo que está bien si eso es todo lo que desea.

Aunque no se puede pasar el enum a sí mismo como un parámetro (ya que en realidad no tiene un equivalente objeto) se puede especificar que debe recibir el class del enum en su constructor y obtener detalles del enum 's de que:

public class EnumAcceptor<E extends Enum<E>> { 
    public EnumAcceptor(Class<E> c) { 
    // Can get at the enum constants through the class. 
    E[] es = c.getEnumConstants(); 
    } 

    enum ABC { 
    A, B, C; 
    } 

    public static void main(String args[]) { 
    EnumAcceptor<ABC> abcAcceptor = new EnumAcceptor<ABC>(ABC.class); 
    } 
} 
+0

Vaya, duplicado de la publicación de @ Tom, lo siento Tom :( – OldCurmudgeon

0

no se puede utilizar E.values() debido al tipo de borrado - el tipo de E no está disponible en tiempo de ejecución.

Para el caso específico en su pregunta, usted está probablemente mejor usar Guava 's Lists.newArrayList:

List<Color> days = Lists.newArrayList(Color.values());