Me gustaría implementar una función con genéricos y varargs.Java genéricos y varargs
public class Question {
public static <A> void doNastyThingsToClasses(Class<A> parent, Class<? extends A>... classes) {
/*** something here ***/
}
public static class NotQuestion {
}
public static class SomeQuestion extends Question {
}
public static void main(String[] args) {
doNastyThingsToClasses(Object.class, Question.class, SomeQuestion.class); // OK
doNastyThingsToClasses(Question.class, SomeQuestion.class); // OK
doNastyThingsToClasses(Question.class, Object.class, SomeQuestion.class); // compilation failure
}
}
La intención aquí es afirmar que todos los parámetros pasados a esta función son objetos de la clase que se extienden la clase dada como primer parámetro. Entonces las dos primeras líneas del método principal se compilarían y la tercera generaría un error.
Mi pregunta es: ¿Por qué me sale "seguridad Tipo: Se crea una matriz genérica de la clase para un varargs parámetro" mensaje para las dos primeras líneas?
¿Falta algo aquí?
pregunta adicional: cómo rediseñar para evitar que esta advertencia se muestre en cada línea llamando a la función "doNastyThingsToClasses"? Puedo cambiarlo a "doNastyThingsToClasses (Class < A> parent, Class <?> ... classes)" y deshacerse de las advertencias, pero esto también elimina la comprobación del tipo de tiempo de compilación --- no tan bueno si quería asegurar el uso correcto de esta función. ¿Alguna mejor solución?
puedo sugerir que es un punto de dolor en varargs - que no deberían han utilizado matrices. De hecho, la falta de autenticidad debería haber sido reemplazada por listas inmutables (y otras) literales. –
OK, las preguntas frecuentes me lo aclararon. Gran enlace. Gracias. – Chris
@Tom: Sí, eso sin duda ha resuelto este en particular. Matrices y genéricos todavía serían un dolor juntos, por supuesto :) –