¿Cómo supera el TypeLiteral de Guice el procedimiento de borrado de tipos genéricos de Java?¿Cómo funciona TypeLiteral de Guice?
Funciona de maravilla, pero ¿cómo se logra esto?
¿Cómo supera el TypeLiteral de Guice el procedimiento de borrado de tipos genéricos de Java?¿Cómo funciona TypeLiteral de Guice?
Funciona de maravilla, pero ¿cómo se logra esto?
El truco que se utiliza aquí es que las firmas de supernombres genéricos se almacenan en subclases y así sobreviven el borrado.
Si crea una subclase anónima new TypeLiteral<List<String>>() {}
Guice puede llamar getClass().getGenericSuperclass()
en él y obtener un java.lang.reflect.ParameterizedType
en el que existe un método para obtener getActualTypeArguments()
List<String>
como una instancia de ParameterizedType
.
Por una combinación de tipos anónimos, subclases y el hecho de que Java no borra por completo TODAS las declaraciones genéricas.
Si observa detenidamente el TypeLiteral tiene un constructor protegido, por lo que usa {} adicional al construir uno nuevo que crea una subclase anónima de TypeLiteral.
En Java las declaraciones genéricas se conservan en las declaraciones de clase y método, por lo tanto, si escribo esto.
public abstract class Class1<T>
{
}
public class Class2 extends Class1<Integer>
{
}
realmente puedo escribir código en Class1 que puede darse cuenta de que su propio tipo genérico es entero Si Clase 2 fue la subclase.
Consulte la API de java.lang.Class para conocer los métodos apropiados (tienen genérico en el nombre).