Capisco che in Java contrariamente a, ad esempio, i generici C# sono funzionalità di compilazione e vengono rimossi tramite cancellazione di tipi. Quindi, come funziona G23's TypeToken
? Come ottiene il tipo generico di un oggetto?Come funziona Gson TypeToken?
risposta
From §4.6 of the JLS (sottolineatura mia):
Tipo cancellazione è una mappatura da tipi (possibilmente tra i tipi parametrici e digitare variabili) ai tipi (che non sono mai tipi parametrizzati o variabili di tipo). Scriviamo | T | per la cancellazione di tipo T. La mappatura della cancellazione è definita come segue:
La cancellazione di un tipo parametrizzato (§4.5) G è | G |.
La cancellazione di un tipo annidato T.C è | T | .C.
La cancellazione di un tipo di matrice T [] è | T | [].
La cancellazione di una variabile di tipo (§4.4) è la cancellazione del limite più a sinistra.
La cancellazione di ogni altro tipo è il tipo stesso.
Pertanto, se si dichiara una classe con una sottoclasse anonima di se stessa, mantiene il suo tipo parametrizzato; non è cancellato. Pertanto, si consideri il seguente codice:
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()));
}
}
Questo uscite:
null
class Erasure
[java.util.HashMap<java.lang.Integer, java.lang.String>]
noti che si otterrebbe un ClassCastException
se non dichiarare la classe anonima, a causa della cancellazione; la superclasse non sarebbe un tipo parametrizzato, sarebbe un Object
.
La cancellazione del tipo di Java si applica a singoli oggetti, non a classi o campi o metodi. TypeToken utilizza una classe anonima per garantire che mantenga informazioni di tipo generico, invece di creare semplicemente un oggetto.
- 1. Come utilizzare un generico personalizzato nella classe GSON TypeToken?
- 2. Errore colata TypeToken al tipo quando la deserializzazione con GSON
- 3. perché la costruzione di TypeToken in Gson è così strana?
- 4. Gson fromJson deserialize generics
- 5. La registrazione di più adattatori con GSON non funziona
- 6. Uso di generici con GSON
- 7. Come serializzare java.nio.file.Path con Gson?
- 8. Come convertire JSONArray in List con Gson?
- 9. Gson: JsonSyntaxException in data
- 10. Come serializzare caratteri giapponesi in UTF-8 usando GSON?
- 11. Come impedire a Gson di esprimere numeri interi come float
- 12. GSON daJson restituisce LinkedHashMap invece di EnumMap
- 13. Problema di token di tipo Gson con deserializzazione generica
- 14. Gson Serializing HashMap <Insegnante, Lista <Student>>
- 15. GSON che analizza il campo dinamico JSON
- 16. GSON come ottenere nome serializzato
- 17. json parse performance tra jackson e gson
- 18. Come esporre un metodo usando GSon?
- 19. gson lancia MalformedJsonException
- 20. Converti stringa JSON in oggetto generico in JAVA (con GSON)
- 21. Tentativo di analizzare JSON con GSON
- 22. Deserializing ImmutableList using Gson
- 23. Creazione dell'oggetto GSON
- 24. android studio java.lang.NoClassDefFoundError Gson
- 25. Java: Gson e codifica
- 26. Deserializzare un'interfaccia usando Gson?
- 27. GSON e InstanceCreator problema
- 28. GSON aggiungere automaticamente nomeclasse
- 29. Gson - Data non separabile
- 30. problema GSON con String