Quando uso GSON per analizzare tra oggetto e JSON, l'inizializzazione di un TypeToken è così strano:perché la costruzione di TypeToken in Gson è così strana?
Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
So solo questo tipo di formato: new TypeToken<Collection<Integer>>().getType();
, ciò che è le parentesi graffe in precedenza per? Grazie in anticipo!
P.S. Ho esaminato il codice sorgente della classe TypeToken
, è un class
(non di interfaccia o astratto) e senza alcun costruttore, il che significa che utilizza no-parameter constructor
come predefinito.
P.S.2 Quando elimino le parentesi, indica che il costruttore non è visibile. Quando ho guardato all'interno della classe TypeToken, questo è il costruttore:
protected TypeToken() {
this.type = getSuperclassTypeParameter(getClass());
this.rawType = (Class<? super T>) $Gson$Types.getRawType(type);
this.hashCode = type.hashCode();
}
Perché non basta usare public
invece?
Grazie, un'altra domanda: cosa succede se si cambia il costruttore predefinito da 'protected' a' public', quando si inizializza 'TypeToken', dobbiamo ancora specificare il generico a' Collection ', perché l'istanza TypeToken non può essere a conoscenza di il tipo di collezione in questo senario? –
Judking
Beh, in effetti, avere la protezione del costruttore è essenziale.Impedisce alle persone di essere in grado di fare 'TypeToken t = new TypeToken ();', che vanificherebbe l'intero scopo della classe. Così com'è, sei * forzato * a sottoclasse in realtà per definire completamente il token, che è ciò che i progettisti intendono. Si può pensare a tutto ciò come a un trucco per aggirare il fatto che Java implementa i generici tramite la cancellazione dei tipi. Spero che renda le cose più chiare. –
Perception
Quindi, questo è il punto: Se uso 'TypeToken t = new TypeToken ();', secondo il meccanismo dei generics, non posso ottenere alcun tipo di informazione su 'Whatever'; mentre se sottoclassi il TypeToken usando 'TypeToken t = new TypeToken () {};', posso ottenere le informazioni sul tipo 'Whatever'? Ho ragione? –
Judking