2012-09-22 23 views

Respuesta

32

El propósito de esto es permitir TypeToken para encontrar el superclase de la instancia - que conservará la información de argumento de tipo.

Por ejemplo, aunque un objeto ArrayList<String> no sabe que que su tipo de elemento es String, debido a la cancelación, la información es superclase no perdido, por lo new ArrayList<String>{} sabe que su superclase es ArrayList<String>, no sólo ArrayList. TypeToken usa esa técnica para representar un tipo genérico construido.

+3

He estado usando 'TypeToken' durante algún tiempo, pero nunca he apreciado la sutileza y la astucia. Eso es bastante asombroso – Ray

18

Hay un uso que Guava puede usar. Como sabe, los tipos se pierden después de la compilación, pero si el tipo se especifica en el nivel de clase, no se pierde después de la compilación y se puede extraer por reflexión. Pondré el código para extraer el tipo en un minuto.


Editar no sé si el código es de alguna utilidad, pero aquí es

public class Reflect { 

    public static void main(String[] args) { 
     Super<String> aStringSuper = new Super<String>() {}; 
     aStringSuper.method(); 

     Super<List<Integer>> aListSuper = new Super<List<Integer>>() {}; 
     aListSuper.method(); 
    } 

} 

class Super<T> { 

    public void method() { 
     Type genericSuperclass = this.getClass().getGenericSuperclass(); 
     ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass; 
     for(Type type : parameterizedType.getActualTypeArguments()) { 
      System.out.println(type); 
     } 
    } 
} 
+0

Ese es el uso real de TypeToken. –

Cuestiones relacionadas