任何人都可以建议给出的代码如何可能导致这样的问题,偶尔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可能发生在上面的代码?任何额外的细节将根据要求提供。
尝试调试,右设置断点的LinkedTreeMap进入你的名单后。希望你的IDE /调试器将允许创建这样复杂的断点。 –