2012-07-14 20 views
7

mam klasę, która deserializes ArrayList rodzajowych z tej funkcji, tak jak opisano w pierwszej odpowiedzi w tym wątku: Java abstract class function generic TypeBłąd odlewania TypeToken typowi podczas deserializacji z gson

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

Eclipse pyta mnie rzucić TypeToken Otrzymany w ten (Sinde funkcja fromJson potrzebuje typ, a nie TypeToken)

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

w rezultacie otrzymuję ten błąd:

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

Na gson user manual mówią ci to poprawny sposób wywoływania funkcji

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

i nie mogę zobaczyć, co robię źle (jeśli jest to ważna odpowiedź, dlaczego ja się tej obsady błąd)

+1

'new ArrayList() .getClass()' jest dokładnie taka sama jak 'ArrayList.class' – newacct

Odpowiedz

10

Dobrze dzwonisz TypeToken.get, który zwraca TypeToken - nie Type. w przykładzie, który pokazujesz, który działa, używa on TypeToken.getType(), który zwraca Type.

Więc mógł zastosowanie:

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

... i że wróci ci Type, ale to nie może być to, co rzeczywiście chcesz. W szczególności ze względu na wymazanie typu, które zwróci Ci ten sam typ, który podasz z witryny wywołania. Jeśli chcesz, aby typ rzeczywiście był zgodny z, należy podać klasę w tej metodzie, chociaż nie jestem do końca pewien, skąd się wybrać. (Odbicie Java API nie jest strasznie jasne, jeśli chodzi o leki generyczne, w moim doświadczeniu).

Tak na marginesie, to spodziewam się metodę zwaną arrayType mieć coś wspólnego z tablic nie ArrayList.

+0

WAW, że był szybki, im testowanie go. W każdym razie z góry dzięki. – dinigo

+0

W końcu musiałem przekazać typ jako argument. To, co mi dałeś, przetworzyło mój JSON bez ostrzeżenia lub błędu, ale w końcu nie pozwoliło mi uzyskać dostępu do każdego elementu tablicy ArrayList. Po prostu nie udało się uzyskać do nich dostępu, mimo że długość była poprawna i działała metoda 'toString()'. – dinigo

Powiązane problemy