2012-09-22 11 views

Antwort

32

Der Zweck ist, TypeToken zu ermöglichen, das Super der Instanz zu finden - wodurch die Typargument-Information erhalten bleibt.

Zum Beispiel, obwohl ein ArrayList<String> Objekt, das nicht weiß, dass sein Elementtyp String ist aufgrund Löschung, die Super Informationen nicht verloren ist, so weiß new ArrayList<String>{}, dass sein Super ArrayList<String> ist, nicht nur ArrayList. TypeToken verwendet diese Technik, um einen konstruierten generischen Typ darzustellen.

+3

Ich habe 'TypeToken' schon seit einiger Zeit benutzt, aber nie die Subtilität und Klugheit geschätzt. Das ist ziemlich beeindruckend – Ray

18

Es gibt eine Verwendung, die Guava verwenden könnte. Wie Sie wissen, gehen Typen nach der Kompilierung verloren, aber wenn der Typ auf Klassenebene korrigiert wird, ist er nach der Kompilierung nicht verloren und kann durch Reflexion extrahiert werden. Ich werde den Code einfügen, um den Typ in einer Minute zu extrahieren.


bearbeiten Ich weiß nicht, ob der Code von Nutzen ist, aber hier ist 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

Das ist die tatsächliche Verwendung von TypeToken. –

Verwandte Themen