2014-11-12 10 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

相关问题