2012-07-14 16 views
7

tengo una clase que deserializa un ArrayList de los genéricos con esta función tal y como se describe en la primera respuesta de este hilo: Java abstract class function generic Typeerror fundición TypeToken a tipo al deserializar con GSON

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

Eclipse me pide que echo TypeToken lo que resulta en esta (Sinde la función fromJson necesita un tipo, no un TypeToken)

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

Como resultado, me sale este error:

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

Al gson user manual te dicen esta es la forma correcta de llamar a la función

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

y no puedo ver lo que estoy haciendo mal (si se trata de una respuesta válida, ¿por qué estoy recibiendo este elenco ¿error?)

+1

'new ArrayList () .getClass()' es exactamente lo mismo que 'ArrayList.class' – newacct

Respuesta

10

Bien, está llamando al TypeToken.get, que devuelve un TypeToken - no un Type. en el ejemplo que está mostrando cuál funciona, está usando TypeToken.getType(), que devuelve Type.

Por lo que pude uso:

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

... y que le devolvería un Type, pero puede que no sea lo que realmente quiere. En particular, debido al borrado de tipo que le devolverá el mismo tipo, T especifique desde el sitio de la llamada. Si desea que el tipo realmente refleje ArrayList<T>, deberá pasar la clase al método, aunque no estoy muy seguro de a dónde ir desde allí. (La API de reflexión de Java no es muy clara cuando se trata de medicamentos genéricos, en mi experiencia.)

Como acotación al margen, yo esperaría un método llamado arrayType tener algo que ver con matrices , no ArrayList.

+0

waw, eso fue rápido, lo estoy probando. De todos modos, gracias de antemano. – dinigo

+0

Finalmente tuve que pasar el tipo como argumento. Lo que me diste, analizó mi JSON sin ninguna advertencia o error, pero al final no me permitió acceder a cada elemento de ArrayList. Simplemente falló el acceso a ellos aunque la longitud era correcta y el método 'toString()' funcionó. – dinigo

Cuestiones relacionadas