2014-11-01 63 views
0

我正在嘗試解決由於使用非類型庫而導致的Java原始類型警告。例如。用於解決原始類型警告的番石榴TypeToken

List dataAsList = response.getDataList(); 

我知道名單是

List<Map<String,Object>> 

類型,但我不知道如何無類型「response.getDataList()」轉換爲類型版本。

我讀了Guava TypeToken可以用於類型問題,但我不知道如何使用這個,我的嘗試不起作用。

+0

「但我不知道如何將無類型的」response.getDataList()「轉換爲打印版本。」 - >好吧,只需將其轉換爲:'(List >)response.getDataList()'。你仍然會從編譯器得到一個類型警告,但是你可以'@SuppressWarnings(「unchecked」)'語句 – fge 2014-11-01 12:16:53

+0

這是我不想做的。我不想獲得類型警告,我也不想取消警告。 – edu00085 2014-11-01 14:49:02

+0

這裏有一些類似的東西,但是對於列表和沒有使用TypeToken:http://stackoverflow.com/a/2848268/4089265 – edu00085 2014-11-01 14:49:39

回答

0

如果List的泛型參數是原始類型,即它本身沒有泛型參數,請查看使用Guava解決方案的my answer to a different question

否則,你可以用Gson做序列化/反序列化。與其他解決方案相比,這可能相對較慢,但實施起來最簡單。假設你每次請求都沒有多次執行此操作,它應該不會比進行任何I/O調用(如數據庫請求)更糟糕。以下示例實際上是Gson API中示例用法的優化修改。

這個例子應該適用於大多數不需要專門序列化的簡單類。

private final static Gson GSON = new Gson(); 

public static <T> T cast(Object object, TypeToken<T> token){ 
    String json = GSON.toJson(object); 
    T result = GSON.fromJson(json, token.getType()); 
    return result; 
} 

用法:

List<Map<String,String>> dataAsList = cast(
    response.getDataList(), new TypeToken<List<Map<String,String>>>(){}); 

免責聲明:

在你描述這個解決方案將無法工作,因爲地圖值類型是Object和GSON不知道哪個輸入您要的確切情況轉換成。我不確定它是否會拋出異常,或者它是否會將其保留爲JsonObject或其他類型。我會試着更多地研究這個。

+0

看起來'String'具有Object,但任何Number都變成了Double,List變成了ArrayList,POJO變成了com.google.gson.internal.StringMap。基本上,你不能依賴Gson轉換來複制類型,而無需在'TypeToken'中指定它們。 – 2014-12-22 18:50:30