¿Cómo funciona Gson TypeToken?

Entiendo que en Java, al contrario de, por ejemplo, los generics C # son características de tiempo de comstackción y se eliminan mediante el borrado de tipos. Entonces, ¿cómo funciona realmente TypeToken de Gson? ¿Cómo se obtiene el tipo genérico de un objeto?

¡Es un truco!

Del §4.6 del JLS (énfasis mío):

La borradura de tipo es una asignación de tipos (posiblemente incluyendo tipos parametrizados y variables de tipo) a tipos (que nunca son tipos parametrizados o variables de tipo). Escribimos | T | para el borrado de tipo T. El mapeo de borrado se define de la siguiente manera:

La eliminación de un tipo parametrizado (§4.5) G es | G |.

La eliminación de un tipo nested TC es | T | .C.

El borrado de una matriz tipo T [] es | T | [].

La eliminación de una variable de tipo (§4.4) es la eliminación de su límite más a la izquierda.

La eliminación de cualquier otro tipo es el tipo mismo.

Por lo tanto, si declara una clase con una subclase anónima de sí misma, conserva su tipo parametrizado; no se borra Por lo tanto, considere el siguiente código:

 import java.lang.reflect.ParameterizedType; import java.util.Arrays; import java.util.HashMap; public class Erasure { public static void main(String...strings) { Class foo = new Erasure>() {}.getClass(); ParameterizedType t = (ParameterizedType) foo.getGenericSuperclass(); System.out.println(t.getOwnerType()); System.out.println(t.getRawType()); System.out.println(Arrays.toString(t.getActualTypeArguments())); } } 

Esto produce:

 null class Erasure [java.util.HashMap] 

Observe que obtendría una ClassCastException si no declaró la clase de forma anónima, debido a la eliminación; la superclase no sería un tipo parametrizado, sería un Object .

El borrado de tipos de Java se aplica a objetos individuales, no a clases, campos o métodos. TypeToken utiliza una clase anónima para garantizar que mantiene información de tipo genérico, en lugar de simplemente crear un objeto.

    Intereting Posts