![](/img/trans.png)
[英]Method reference results in raw-type compiler warning, but lambda does not
[英]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.