Bonjour,
Je n'ai pas beaucoup d'expérience en java, et je cherche à factoriser du code très dupliqué en utilisant les génériques (ou templates dans mon vocabulaire à moi). Je me heurte à quelques soucis.
Tout d'abord, voici un exemple du code qui est dupliqué:
private void readsFoo() throws Exception {
JsonArray jsonArray = getJsonArray(foo_field);
Type listType = new TypeToken<List<Foo>>() {
}.getType();
List<Foo> fooList= gson.fromJson(jsonArray, listType);
for (Foo foo : fooList) {
.....
}
}
private void readsGoo() throws Exception {
JsonArray jsonArray = getJsonArray(goo_field);
Type listType = new TypeToken<List<Goo>>() {
}.getType();
List<Goo> gooList= gson.fromJson(jsonArray, listType);
for (Goo goo : gooList) {
.....
}
}
Voici ensuite ce que donne mon code:
private void readsFoo() throws Exception {
JsonArray jsonArray = getJsonArray(foo_field);
List<Foo> fooList = getElementsList(jsonArray);
for (Foo foo: fooList ) {
.....
}
}
private <T> List<T> getElementsList(JsonArray iArray)
{
Type listType = new TypeToken<List<T>>() {}.getType();
validateJsonElement(listType, "In getElementsList: Unable to find field TypeTokens");
List<T> list = gson.fromJson(iArray, listType);
validateJsonElement(list, "In getElementsList: Unable to find list from Json");
return list;
}
À l'exécution, java me renvoie l'exception suivante:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to ....json.Foo
J'ai cru comprendre que Java ne retenait pas le type du générique à la compilation. Je suppose que le problème vient de là mais je ne trompe peut-être.
Y'a t'il une solution implémentation ? je suppose que oui sinon comment pourrait-on avoir des listes, vecteurs, etc ... capables de travailler avec n'importe quel type d'objet ??
Merci
Dernière modification par Zangdar MortPartout ; 15/08/2016 à 17h32.
|