簡體   English   中英

ArrayList包含錯誤的類型對象,沒有顯式的原始類型轉換

[英]ArrayList contains wrong type objects without explicit raw-type casting

任何人都可以建議給定代碼如何可能導致此類問題,從文件中解析數據時偶爾會出現ClassCastException

細節 :

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

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 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嗎? 任何額外的細節將根據要求提供。

默認情況下,如果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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM