Java reflection y los tipos genéricos

Por temas del trabajo llevo unos días pegandome con java reflection y los tipos de genéricos. Debo reconocer que las dos cosas están muy bien, pero entre ellas no se llevan bien. Para facilitar un poco la cosa voy a poner un ejemplo de un tipo genérico:

1
2
3
4
5
6
7
8
9
10
11
12
public class Lista<tipo> {
   /* para evitar problemas con wordpress: </tipo> */
   tipo leeElementoEnPosicion(int posicion) {
      tipo rtn = null;
      /* Buscamos el elemento y lo devolvemos */
      return rtn;
   }
 
   void agregarElemento(TipoElemento elm) {
      /* Insertamos el elemento */
   }
}

El código anterior no hace nada, pero nos permite ver que creamos una clase Lista que es genérica. El hecho de que sea genérica significa que podemos decir que la lista podrá almacenar cualquier tipo de dato y que se lo indicaremo al crearla (antiguamente en java sólo se podía almacenar un tipo de dato: Object).

Mi problema empieza cuando yo necesito desde una instancia de la clase Lista cuál es el tipo de dato que almacena. Inicialmente sería tan sencillo como hace lo siguiente:

public Class leerTipoElementoLista() {
   return tipo.class;
}

El problema es que, según parece, en la práctica java no utiliza genéricos, sino que sólo los comprueba en tiempo de compilación. Esto significa que una vez compilado el programa, tipo deja de ser un tipo conocido y pasa a ser algo completamente indeterminado, o dicho de otro modo, se convierte en un Object. A causa de esto, la sentencia anterior (tipo.class) genera un error de compilación.

Buscando por el gran Google encontré una referencia a Hibernate donde comentaban un modo de hacerlo:

(Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

Lo he estado probando y lo único que puedo decir es que falla en la ejecución. La sentencia anterior genera una CastException, así que nada.

Y yo necesito poder saber el tipo del genérico :'(

Un comentario en “Java reflection y los tipos genéricos

  1. Hola me pidieron esto en la facu y solo lo pude hacer estaticamente, queria saber si se podia hacer de alguna forma con reflection y/o generics, gracias!

    Realizar una clase Transform que se utiliza para transformar objetos en otros objetos, crear un método que
    reciba el objeto a transformar y un String que le indique a que se quiere transformar, considerar:

    * objeto transforma entre los tipos Wrappers Integer, Long, Short, Double, Float y String
    * cuando no se puede transforma algún tipo (ej double a int) se hace lo que se puede por ejemplo en redondear el numero a su valor entero para Float a Integer

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.