2016-08-15 10 views
0

リストが関与していない限り、私はこの問題の解決策をいくつか見てきたので、何かができるかどうか確認するために私の運を押しています。Java、Gson、リストとGenerics

私はジェネリックスを使用して重複したコードを分解したいと考えています。おそらくタイプ消去に関係している人がいます。まず、ここでは重複したコードのサンプルです:

実行時に
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; 
} 

が、私は次のエラーを得た:今

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) { 
     ..... 
    } 
} 

が、ここで私は自分自身を生成するコードがあるとjava.lang.ClassCastException :com.google.gson.internal.LinkedTreeMapはキャストできません.... json.Foo

この問題を解決する方法はありますか?率直に私は再利用可能なコードが嫌いです。 ありがとう!

+0

あなたのコード(両方のバージョン)をデバッグして、両方のバリエーションに 'listType'が入っていることを確認しましたか?スタックトレースを投稿できますか? – Thomas

答えて

0

基本的にTypeTokenはジェネリックタイプでは作成できません。代わりに引数として渡すことができます:

private void readsFoo() throws Exception { 
    JsonArray jsonArray = getJsonArray(foo_field); 
    List<Foo> fooList = getElementsList(jsonArray, new TypeToken<List<Foo>>(){}); 

    for (Foo foo: fooList) { 
     ..... 
    } 
} 

private <T> List<T> getElementsList(JsonArray iArray, TypeToken<List<T>> tt) 
{ 
    Type listType = tt.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; 
} 

あなたは正しいと思います。 Tが消去されているため、作成するTypeTokenは、List<Foo>の代わりにList<T>の型を保持します。これには情報が含まれません。

+0

このアドバイスをいただき、ありがとうございました – Zangdar