2014-11-12 13 views
3

任何人都可以建議給出的代碼如何可能導致這樣的問題,偶爾ClassCastException從數據解析文件。ArrayList包含錯誤的類型對象,沒有顯式的原始類型轉換

詳情:

我在超類中有一個泛型方法。

public T getItem(int position) { 
    return mItems.get(position); // mItems is an ArrayList 
} 
// corresponding setter 
public void setItems(List<T> items) { 
    mItems = items; 
    notifyDataSetChanged(); 
} 

它,然後在T = AdItem如下子類中使用:

AdItem adItem = getItem(position); 

一切工作正常,但我在上面提到的符合例外偶爾生產崩潰報告:

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to .mypackage.AdItem

這明顯表明該列表包含LinkedTreeMap而不是AdItem

列表是從JSON解析,該代碼是類型安全的,即無生型鑄造,未經檢查的警告等

是什麼情景ArrayList<AdItem>包含LinkedTreeMap對象運行?
除明確的未檢查/原始類型轉換爲Object並返回ArrayList,情況並非如此。

從文件解析JSON:

ArrayList<AdItem> tempList = gson.fromJson(jsonReader, typeToken.getType()); 

其中

typeToken = new TypeToken<ArrayList<AdItem>>() {}; 

所以tempList應該只包含AdItem

任何人都可以解釋如何ClassCastException可能發生在上面的代碼?任何額外的細節將根據要求提供。

+0

嘗試調試,右設置斷點的LinkedTreeMap進入你的名單後。希望你的IDE /調試器將允許創建這樣複雜的斷點。 –

回答

1

默認情況下,如果它無法正確識別提供的類型,則會將JSON對象反序列化爲LinkedHashMap。

使用代碼下面給出獲得的類型,然後再試一次:

TypeFactory.defaultInstance().constructCollectionType(ArrayList.class,AdItem.class) 

or 

new ObjectMapper().getTypeFactory().constructCollectionType(ArrayList.class,AdItem.class) // In case you are using ObjectMapper 

ArrayList<AdItem> tempList = gson.fromJson(jsonReader, TypeFactory.defaultInstance().constructCollectionType(ArrayList.class,AdItem.class)); 
+0

你解決了這個問題嗎? –

+0

我會試一下,+1幫忙 – kiruwka

相關問題