2012-09-22 10 views

risposta

32

Lo scopo di questo è quello di permettere TypeToken per trovare i superclasse dell'istanza - che manterrà le informazioni sull'argomento tipo.

Ad esempio, anche se un oggetto ArrayList<String> non sa che che il suo tipo di elemento è String, dovuto alla cancellazione, le informazioni superclasse è non perso, quindi new ArrayList<String>{} sa che la sua superclasse è ArrayList<String>, non solo ArrayList. TypeToken utilizza tale tecnica per rappresentare un tipo generico costruito.

+3

Ho usato 'TypeToken' per un po 'di tempo, ma non ho mai apprezzato la sottigliezza e l'intelligenza. È davvero fantastico – Ray

18

C'è un uso che Guava potrebbe usare. Come sapete, i tipi vengono persi dopo la compilazione, ma se il tipo è speficato a livello di classe, non è perso dopo la compilazione e può essere estratto per riflessione. Inserirò il codice per estrarre il tipo in un minuto.


Edit non so se il codice è di alcuna utilità, ma qui è

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

Questo è l'uso effettivo di TypeToken. –