Obtenir el tipus d'un objecte amb generics

1 view
Skip to first unread message

Sergi Martínez

unread,
Dec 30, 2011, 7:45:07 AM12/30/11
to Catalonia Android Community Group
Hola a tots  

Us comento un problema que ens vam trobar durant la finappsparty i del que ja he vist tres solucions diferents, pero voldria saber quina creieu es més elegant o en proposeu de noves. 

Imaginem que este deserialitzant una clase amb Gson:

Gson gson=new Gson();
Filostro filostro=gson.fromJson(result, Filostro.class);

Fins aquí cap problema, donem per suposat que la cadena result conté un filostro, i lor de la brevetat donarem per suposat que tot està be. 

Ara imaginem que ens retornen una llista:

Gson gson=new Gson();
List<Filostro> filostros=gson.fromJson(result, List<Filostro>.class);

I aixó no tira be, per que per molt generic que tingui List<Filostro>, el tipus base es List, i deserialitza el que li dona la gana (ahir ens feia un list de hashmaps (ole, ole )). 

Solució 1:

Gson gson=new Gson();
List<Filostro> filostros=new List<Filostro>();
filostros=gson.fromJson(result, filostros.class);

Pero no m'agrada, ja que obliga a instanciar per res 

Solució 2:

Creem una clase nova:

public Class Filostros extends List<Filostro> {}

...
Gson gson=new Gson();
Filostros filostros=gson.fromJson(result, Filostros.class);

Aquesta m'agrada molt , pero potser es per que vinc de .Net i allà es una solució molt comú. 

Solució 3:

Es una que vaig veure al codi del Roc, que utilitza un token, pero no ho vaig entendre. Roc? fores tan mamable? 


I vosaltres que en penseu?

P.D.: els dibuixets els ha escollit la meva filla que m'estava "ajudant" a fer el mail #solosencasa

--

Sergi Martínez


sergi.m...@gmail.com
327.gif
050.gif
7D4.gif
330.gif
1D4.gif
1DD.gif
329.gif
1D5.gif
334.gif
1BC.gif
344.gif

Bernat

unread,
Dec 30, 2011, 7:51:33 AM12/30/11
to catd...@googlegroups.com
Ja deia yo, que n entenia a que venien... Saludala de part de tot catdroid home!

Anem a lo serio.

Pel que em vas comentar ahir de les interficies, list, etc.. jo crec que la solució 2 es bastant bona, m'agarda l'idea de generalitzar la clase Filostros com una de List<Filostro> ((Que es un filostro??))

Per una raó, quan necessits el llistat ja tens la classe tipus creada, aixi sempre hi pots treballar d'una manera simple...

No se si m'he explicat, segurament no i no está al'altura dels grans filosofs de Java/android que tenim per la sala, pero bé...

EAGIN Software

unread,
Dec 30, 2011, 8:01:13 AM12/30/11
to catd...@googlegroups.com

Per si ajuda, jo a la meva app ho faig així i em funciona perfect

Type collectionType = new TypeToken<List<Filostro>>(){}.getType();

filostro = new Gson().fromJson(read, collectionType);

Sent from an android device.

Esteve Aguilera
"EAGIN Software"
http://eaginsoftware.com
http://twitter.com/EAGINsoftware
http://es.linkedin.com/in/esteveaguilera

Roc Boronat

unread,
Dec 30, 2011, 8:08:39 AM12/30/11
to catd...@googlegroups.com
Sergi, jo ho faig com l'Esteve, amb el TypeToken.

Em fa mal dir-ho però: No ho entenc. Tampoc m'hi he escarrassat, però... it works.

Roc Boronat
http://rocboronat.net

Sergi Martínez

unread,
Dec 30, 2011, 8:12:53 AM12/30/11
to catd...@googlegroups.com

Ui a mi el but it works...

EAGIN Software

unread,
Dec 30, 2011, 8:19:32 AM12/30/11
to catd...@googlegroups.com

Jo entenc que es el que fas tu amb:

Gson gson=new Gson(); List<Filostro> filostros=gson.fromJson(result, List<Filostro>.class);

Pero ben fet :P

Vamos, que it works...

Sent from an android device.

Esteve Aguilera
"EAGIN Software"
http://eaginsoftware.com
http://twitter.com/EAGINsoftware
http://es.linkedin.com/in/esteveaguilera

Roc Boronat

unread,
Dec 30, 2011, 8:34:36 AM12/30/11
to catd...@googlegroups.com
@Sergi: si, ya ;·)

Roc Boronat
http://rocboronat.net

Sergi Martínez

unread,
Dec 30, 2011, 8:45:44 AM12/30/11
to catd...@googlegroups.com

Que consti que l'afirmacio pot variar depenent de les hores que fa que m'hi barallo :)

EAGIN Software

unread,
Dec 30, 2011, 8:47:59 AM12/30/11
to catd...@googlegroups.com

Jeje...

De fet Sergi, jo m'hi vaig estar barallant, i despres de buscar vaig veure que era el més utilitzat en aquest cas, així que...

Ja diras el que...

Sent from an android device.

Esteve Aguilera
"EAGIN Software"
http://eaginsoftware.com
http://twitter.com/EAGINsoftware
http://es.linkedin.com/in/esteveaguilera

Joan Pujol

unread,
Dec 30, 2011, 9:18:03 AM12/30/11
to CatD...@googlegroups.com, catd...@googlegroups.com
La història d'això és que la informació dels genèrics es perd en runtime i el que estàs fent amb el TypeToken és pràcticament el que fas amb la solució 2.
Fixeu-vos que quan fas new TypeToken<List<Filostro>>(){}.getType() hi ha un {} amb la qual cosa crees una classe anònima on si acaba registrat el tipus ja que si tens

class A<T> {
   void m(T a)
}

class B extends A<Integer> {
 
}

m a B es tradueix en m(Integer) i això si que acaba guardat a la informació en runtime de la classe i per tant pot ser utilitzat pel GSON a l'hora de deserialitzar.

Salutacions,

Reply all
Reply to author
Forward
0 new messages