2012-07-14 10 views
7

ho una classe che deserializza un ArrayList di farmaci generici con questa funzione proprio come descritto nella prima risposta di questa discussione: Java abstract class function generic TypeErrore colata TypeToken al tipo quando la deserializzazione con GSON

public <T> ArrayList<T> arrayType(String data){ 
    return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass())); 
} 

Eclipse mi chiede di esprimere TypeToken con conseguente questo (Sindhi la funzione fromJson ha bisogno di un tipo, non un TypeToken)

public <T> ArrayList<T> arrayType(String data){ 
    return g.fromJson(data, (Type) TypeToken.get(new ArrayList<T>().getClass())); 
} 

Come risultato ottengo questo errore:

java.lang.ClassCastException: com.google.gson.reflect.TypeToken cannot be cast to java.lang.reflect.Type 

Al gson user manual ti dicono questo è il modo corretto di chiamare la funzione

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType(); 
Collection<Integer> ints2 = gson.fromJson(json, collectionType); 

e non riesco a vedere quello che sto facendo di sbagliato (se si tratta di una risposta valida, perché mi appare questo cast errore?)

+1

'new ArrayList () .getClass()' è esattamente lo stesso di 'ArrayList.class' – newacct

risposta

10

Beh, stai chiamando TypeToken.get, che restituisce un TypeToken - non un Type. nell'esempio che stai mostrando che funziona, sta usando TypeToken.getType(), che restituisce un Type.

Così si potrebbe uso:

return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass()).getType()); 

... e che torneranno un Type, ma non può essere quello che realmente vuole. In particolare, a causa della cancellazione del tipo che ti restituirà lo stesso tipo qualunque sia lo T specificato dal sito di chiamata. Se vuoi che il tipo rispetti lo rispetti lo ArrayList<T>, devi passare la classe nel metodo, anche se non sono del tutto sicuro da dove andare. (La riflessione API Java non è molto chiaro quando si tratta di farmaci generici, nella mia esperienza.)

Per inciso, mi aspetto un metodo chiamato arrayType di avere qualcosa a che fare con gli array , non ArrayList.

+0

waw, è stato veloce, lo sto testando. Comunque grazie in anticipo. – dinigo

+0

Alla fine ho dovuto passare il tipo come argomento. Quello che mi hai dato ha analizzato il mio JSON senza alcun avvertimento o errore ma alla fine non mi ha permesso di accedere ad ogni elemento di ArrayList. Ha appena fallito l'accesso a loro anche se la lunghezza era corretta e il metodo 'toString()' ha funzionato. – dinigo

Problemi correlati