2015-05-02 4 views
14

Ich verstehe, dass in Java im Gegensatz zu zum Beispiel C# Generika Kompilierzeit Feature sind und wird durch Typ löschen entfernt. Also, wie funktioniert Gson TypeToken wirklich? Wie erhält es den generischen Typ eines Objekts?Wie funktioniert Gson TypeToken?

Antwort

18

It's a trick!

From §4.6 of the JLS (Hervorhebung von mir):

Typ Löschung ist eine Zuordnung von Typen (möglicherweise parametrisierte Typen einschließlich und geben Sie Variablen) auf Typen (die nie parametrisierte Typen sind oder Variablen eingeben). Wir schreiben | T | zum Löschen des Typs T. Das Löschmapping ist wie folgt definiert:

Das Löschen eines parametrierten Typs (§4.5) G ist | G |.

Das Löschen eines verschachtelten Typs T.C ist | T | .C.

Das Löschen eines Array-Typs T [] ist | T | [].

Das Löschen einer Typvariablen (§4.4) ist das Löschen der äußersten linken Grenze.

Die Löschung jedes anderen Typs ist der Typ selbst.

Deshalb, wenn Sie eine Klasse mit einer anonymen Unterklasse von selbst erklären, es hält es parametrisierte Typ ist; Es ist nicht gelöscht. Daher betrachten Sie den folgenden Code:

import java.lang.reflect.ParameterizedType; 
import java.util.Arrays; 
import java.util.HashMap; 

public class Erasure<T> 
{ 
    public static void main(String...strings) { 
     Class<?> foo = new Erasure<HashMap<Integer, String>>() {}.getClass(); 
     ParameterizedType t = (ParameterizedType) foo.getGenericSuperclass(); 
     System.out.println(t.getOwnerType()); 
     System.out.println(t.getRawType()); 
     System.out.println(Arrays.toString(t.getActualTypeArguments())); 
    } 
} 

Diese Ausgänge:

null 
class Erasure 
[java.util.HashMap<java.lang.Integer, java.lang.String>] 

Beachten Sie, dass Sie eine ClassCastException bekommen würde, wenn Sie nicht die Klasse anonym erklären haben, wegen der Löschung; Die Oberklasse wäre kein parametrisierter Typ, es wäre ein Object.

4

Die Java-Typlöschung gilt für einzelne Objekte, nicht Klassen oder Felder oder Methoden. TypeToken verwendet eine anonyme Klasse, um sicherzustellen, dass allgemeine Informationen gespeichert werden, anstatt nur ein Objekt zu erstellen.

Verwandte Themen