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
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
.
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.
- 1. Wie benutzerdefinierte generische in GSON TypeToken Klasse verwenden?
- 2. Fehler TypeToken Gießen auf Typen, wenn sie mit Gson Deserialisieren
- 3. Warum ist die TypeToken Konstruktion in Gson so komisch?
- 4. Registrierung mehrerer Adapter mit GSON funktioniert nicht
- 5. Wie TypeToken verwenden, um Typparameter abzurufen?
- 6. Wie Standard-Deserialisierung mit Gson
- 7. Gson fromJson deserialize generics
- 8. Verwenden von Generics mit GSON
- 9. Gson IllegalStateException
- 10. Gson fromJson generische Superklasse mit
- 11. Kann Guava's TypeToken den spezifischen Typ eines generischen Feldes bekommen?
- 12. Gson Typ Token Problem mit generischer Deserialisierung
- 13. GSON fromJson mit komplexem JSONObject funktioniert nicht
- 14. gson Serialisierung von Unicode-String funktioniert nicht
- 15. Wie serialisiert man japanische Zeichen in UTF-8 mit GSON?
- 16. Wie serialisiert man java.nio.file.Path mit Gson?
- 17. Gson Serialisierung statt meiner Entity LinkedTreeMap
- 18. GSON fromJson zurück LinkedHashMap anstelle von EnumMap
- 19. Gson wandelt statt mein Objekt
- 20. JSonArray zu String für mit Gson Parsen
- 21. GSON-Deserialisierungsproblem
- 22. GSON-Ausnahme: Erwartete BEGIN_ARRAY, aber war BEGIN_OBJECT
- 23. Json-Gson-Bindung funktioniert nicht (Exception-Objekt/String)
- 24. Nullpointer Deserialisieren mit Gson
- 25. Nachrüstung + Gson Deserializer: Rückkehr innerhalb Array
- 26. Gson Serialisierung: wie generische Klasse und generische Daten in sie zu werfen?
- 27. JSON Deserialisierung Gson mit
- 28. kann nicht Json-Array mit Gson
- 29. JSON String in generisches Objekt in JAVA konvertieren (mit GSON)
- 30. GSON-Objekt erstellen