Hay una buena discusión sobre los Genéricos y lo que realmente hacen entre bastidores en esta pregunta, así que todos sabemos que Vector<int[]>
es un vector de matrices de enteros, y HashTable<String, Person>
es una tabla cuyas claves son cadenas y valores Personas
.
Sin embargo, lo que me deja perplejo es el uso de Class<>
.
Se supone que la clase java Class
también toma un nombre de plantilla, (o eso me dice el subrayado amarillo en eclipse). No entiendo qué debo poner ahí. El objetivo del objeto Class
es cuando no tienes toda la información sobre un objeto, para la reflexión y tal. ¿Por qué me hace especificar qué clase tendrá el objeto Class
? Está claro que no lo sé, o no usaría el objeto Class
, sino que usaría la específica.
El uso de la versión generada de la clase Class le permite, entre otras cosas, escribir cosas como
Class<? extends Collection> someCollectionClass = someMethod();
y entonces puedes estar seguro de que el objeto Class que recibes extiende Collection
, y una instancia de esta clase será (al menos) una Collection.
De la documentación de Java:
[...] Más sorprendentemente, la clase Class ha sido generada. Los literales de clase ahora funcionan como tokens de tipo, proporcionando información de tipo tanto en tiempo de ejecución como de compilación. Esto permite un estilo de fábricas estáticas ejemplificado por el método getAnnotation en la nueva interfaz AnnotatedElement:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Este es un método genérico. Infiere el valor de su parámetro de tipo T a partir de su argumento, y devuelve una instancia apropiada de T, como se ilustra en el siguiente fragmento:
Author a = Othello.class.getAnnotation(Author.class);
Antes de los genéricos, habría tenido que lanzar el resultado a Author. Además, no habría tenido forma de hacer que el compilador comprobara que el parámetro real representaba una subclase de Annotation. [...]
Bueno, nunca he tenido que usar este tipo de cosas. ¿Alguien?
A menudo se quieren utilizar comodines con Class
. Por ejemplo, Class<? extends JComponent>
, te permitiría especificar que la clase es una subclase de JComponent
. Si has recuperado la instancia de Class
desde Class.forName
, entonces puedes usar Class.asSubclass
para hacer el cast antes de intentar, digamos, construir una instancia.