2011-12-11 77 views
2

當我打電話:類型擦除,通過類的說法

ArrayList<MyType> myobject = new Gson().fromJson(data, new TypeToken<ArrayList<T>>(){}.getType()); 

一切工作正常,使用fromJson(String, Type)
當我打電話:

ArrayList<MyType> myobject = helper(data); 

public ArrayList<MyType> helper(String data){ 
    return new Gson().fromJson(data, new TypeToken<ArrayList<MyType>>(){}.getType()); 
} 

它仍然工作正常,但是當我打電話:

ArrayList<MyType> myobject = helper(data, MyType.class); 

public <T> ArrayList<T> helper(String data, Class<T> type){ 
    return new Gson().fromJson(data, new TypeToken<ArrayList<T>>(){}.getType()); 
} 

type參數不正確。
我該如何解決最後的代碼片段?

SOLUTION

由於@LewsTherin建議,我只是給了確切類型的參數從主叫
所以助手的聲明是這樣:

public <T> ArrayList<T> helper(String data, Type type){ 
    ArrayList<T> rtn = g.fromJson(data, type); 
    return rtn; 
} 

,並呼籲像:

variable = helper(data, new TypeToken<ArrayList<MyType>>(){}.getType()); 

但是,如果有人可以編輯輔助函數到si mplify代碼,我會標記他是正確的!

回答

1

我不認爲它會工作,如果你使用助手功能。解決方案可能是從調用方法中傳遞類型。所以很清楚發生了什麼事情。

return new Gson().fromJson(data, new TypeToken<ArrayList<T>>(){}.getType()); 

這實際上並不指定對象類的類型。因此爲什麼它不起作用?你可以去處理這個

1

一種方法是從GSON分析列表中你的自我:

private <S> List<S> readFromJson(Reader input, Class<S> type) { 
    JsonParser parser = new JsonParser(); 
    JsonElement element = parser.parse(input); 
    ImmutableList.Builder<S> builder = ImmutableList.builder(); 
    for (JsonElement jsonElement : element.getAsJsonArray()) { 
     builder.add(fromJson(jsonElement)); 
    } 
    return builder.build(); 
} 

private <S> S fromJson(JsonElement jsonElement, Class<S> type) { 
    return configReader.fromJson(jsonElement, type); 
} 

此外,GSON文檔有類似你正在試圖完成一個例子:https://sites.google.com/site/gson/gson-user-guide#TOC-InstanceCreator-for-a-Parameterized