Estoy intentando inicializar una clase genérica con todos los valores disponibles de un Enum. Así es cómo me gustaría que funcione:Use Enum.values con clase genérica que se extiende Enum
public class MyClass<E extends Enum<E>> {
E[] choices;
public MyClass() {
choices = E.values();
}
Sin embargo, la llamada a E.values
no es aceptada en Eclipse diciendo que este método no está definido para este E.
El uso de este constructor vez se acepta, pero requiere la persona que llama para proporcionar los valores:
public MyClass(E[] e) {
choices = e;
}
En la documentación que encontré:
Los tipos de enum del lenguaje de programación Java son mucho más potentes que sus contrapartes en otros idiomas. La declaración enum define una clase (llamada tipo enum). El cuerpo de la clase enum puede incluir métodos y otros campos. El compilador agrega automáticamente algunos métodos especiales cuando crea una enumeración. Por ejemplo, tienen un método de valores estáticos que devuelve una matriz que contiene todos los valores de la enumeración en el orden se declaran.
¿Hay alguna forma de solucionar este problema?
creo que esto no tiene nada que ver con el tipo de borrado. La causa del problema es que el método 'public static E [] values ()' no es un método presente en la clase 'java.lang.Enum'. [La especificación del lenguaje Java] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2) explica que este método, sin embargo, se genera de forma sintética para todas las enums. Entonces, en mi opinión, el método está presente en cualquier referencia concreta de una enumeración, pero no en la clase enum misma. –
Si tiene dos clases, clase 'Un público { \t \t pública prueba static void() {}} ' y 'public class B { \t \t B pública() {A.test(); } } ', la línea A.test() sigue siendo un error de tiempo de compilación, porque en tiempo de ejecución, el compilador no sabría el tipo de A sin que esté explícitamente definido, digamos como un parámetro de tipo A pasado al constructor . – Jeshurun
@Jeshrun No, no lo es. Es un error en tiempo de compilación porque en su declaración 'clase B ' el 'A' es un argumento de tipo ilimitado. La 'A' en esta declaración no tiene nada que ver con la clase 'A'.¿Compilaría si lo declara como 'clase B' donde la declaración no tiene ambigüedades obvias entre el parámetro de tipo y el nombre de clase y usando una referencia a T? –