2010-06-20 23 views
8

Tengo un viejo código de análisis de argumentos de línea de comandos que escribí hace 4 años para Java 5, y no se compilará en Java 6 gracias a los cambios en cómo se manejan los genéricos y si ciertas clases de biblioteca son genéricas. Mientras intentaba solucionarlo, me encontré con el siguiente problema; ya que han pasado 4 años desde que toqué Java y nunca fui un experto en genéricos para empezar, me está abrumando.¿No puede ser tan específico con los tipos de campos genéricos de Java como con los tipos de métodos genéricos?

La biblioteca me permite especificar que ciertas opciones de línea de comandos corresponden a enumeraciones. Para hacer esto, el objeto ArgumentSpecification correspondiente a esta opción quiere mantener un objeto Class, que llamaremos "enumClass", correspondiente a la clase enum. Lamentablemente, parece que no puedo averiguar cómo escribir correctamente el tipo de ese campo para limitarlo a contener objetos de clase que corresponden a clases reales de Enum. Creo que lo que quiero es algo así como:

protected <E extends Enum<E>> Class<E> enumClass; // compiler error 

pero el compilador barf en esto. Por otra parte, el compilador es totalmente feliz con métodos que tienen valores de retorno y/o parámetros especificados de esta manera:

protected <E extends Enum<E>> Class<E> dummyTest(Class<E> foo) { return foo; } // "works" 

puedo tratar de usar esto para el campo en su lugar:

protected Class<? extends Enum<?>> enumClass; 

pero eso en realidad tampoco funciona ... otras partes del código necesitan el tipo "<E extends Enum<E>>" para que puedan llegar a E, y esto no parece coincidir con el "<? extends Enum<?>>", ya que obtengo errores del compilador como este:

Bound mismatch: The generic method checkedEnumFromString(Class<E>, String) of type EnumUtil is not applicable for the arguments 
(Class<capture#1-of ? extends Enum<?>>, String). The inferred type capture#1-of ? extends Enum<?> is not a valid substitute for the bounded 
parameter <E extends Enum<E>> 

¿Hay alguna manera de declarar el campo con el tipo correcto aquí que me falta? Si es así, ¿qué es? Si no, ¿no está horriblemente roto Java para poder declarar tipos en métodos que no se pueden usar para los campos? ¿O estoy tan terriblemente confundido que mi pregunta no tiene sentido para empezar?

Respuesta

9

Si es necesario definir un campo con el parámetro explícito E así, entonces puede que tenga que parametrizar el tipo en el que el campo se declara en algo como esto compila:.

class MyClass<E extends Enum<E>> { 
    Class<E> enumClass; 
} 
+2

Tenía miedo de eso ... ugh. Creo que, en mi caso, sería menos inteligente simplemente aceptar que el sistema de tipos de Java está retrasado (gracias, tipo borrado) y usar "Class enumClass"; junto con un pimiento liberal @ShutTheHellUp ("desmarcado"); Gracias por la respuesta, sin embargo. –

7

Usted está tratando declarar un "campo genérico", uno que tiene un parámetro de tipo en sí mismo. No existe tal concepto en Java: solo los métodos y tipos pueden introducir parámetros de tipo.

Como dice polygenelubricants, puede introducir un parámetro de tipo adicional en el tipo mismo y usarlo como el tipo del campo.

Cuestiones relacionadas