2012-07-14 16 views
7

Ich habe eine Klasse, die eine Arraylist von Generika mit dieser Funktion deserialisiert ebenso wie in der ersten Antwort dieses Threads beschrieben: Java abstract class function generic TypeFehler TypeToken Gießen auf Typen, wenn sie mit Gson Deserialisieren

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

Eclipse-me TypeToken zu werfen fragt in dieser resultierenden (Sinde die Funktion fromJson einen Typ braucht, kein TypeToken)

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

Als Ergebnis, das ich diesen Fehler:

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

Am gson user manual sie Ihnen sagen, dies ist der richtige Weg

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

die Funktion aufrufen, und ich kann nicht sehen, was ich tue, falsch (wenn es sich um eine gültige Antwort ist, warum ich immer diese Besetzung Fehler?)

+1

'neue ArrayList () .getClass()' ist genau das selbe wie 'ArrayList.class' – newacct

Antwort

10

Nun, Sie rufen TypeToken.get, die eine TypeToken zurückgibt - kein Type. In dem Beispiel, das Sie zeigen, was funktioniert, verwendet es TypeToken.getType(), die eine Type zurückgibt.

So Sie konnte Verwendung:

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

... und das würden Sie eine Type zurückkehren, aber es kann nicht sein, was Sie eigentlich wollen. Insbesondere aufgrund der Art der Löschung, die Ihnen den gleichen Typ zurückgibt, unabhängig von T, den Sie von der Aufrufseite aus angeben. Wenn Sie möchten, dass der Typ wirklichArrayList<T> widerspiegelt, müssen Sie die Klasse in die Methode übergeben, obwohl ich nicht ganz sicher bin, wohin ich von dort gehen soll. (Das Java-Reflection-API ist nicht sehr klar, wenn es um Generika kommt, in meiner Erfahrung.)

Als Nebenwirkung ich eine Methode namens erwarten würde arrayType etwas mit Arrays zu tun, nicht ArrayList.

+0

waw, das war schnell, im Test es. Jedenfalls danke im Voraus. – dinigo

+0

Ich musste den Typ schließlich als Argument übergeben. Was Sie mir gegeben haben, analysierte meinen JSON ohne irgendeine Warnung oder einen Fehler, aber am Ende konnte ich nicht auf jedes Element der ArrayList zugreifen. Der Zugriff auf sie ist fehlgeschlagen, obwohl die Länge korrekt war und die 'toString()' Methode funktioniert hat. – dinigo

Verwandte Themen