Java ArrayList包含错误的类型对象,没有显式的原始类型转换

Java ArrayList包含错误的类型对象,没有显式的原始类型转换,java,android,generics,type-safety,gson,Java,Android,Generics,Type Safety,Gson,有谁能建议一下给定的代码如何可能导致这样的问题,当从文件中解析数据时,偶尔会出现ClassCastException 详情: 我在超类中有一个泛型方法 public T getItem(int position) { return mItems.get(position); // mItems is an ArrayList } // corresponding setter public void setItems(List<T> items) { mItems

有谁能建议一下给定的代码如何可能导致这样的问题,当从文件中解析数据时,偶尔会出现
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();
}
一切正常,但我偶尔收到生产崩溃报告,上述生产线除外:

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap不能强制转换为.mypackage.AdItem

这显然表明列表包含
LinkedTreeMap
,而不是
AdItem

列表是从json解析的,代码是类型安全的,即没有原始类型转换、未检查的警告等

什么是
ArrayList
包含
LinkedTreeMap
对象运行时的场景?

除了显式取消选中/原始类型转换到
对象
并返回到
数组列表
,情况并非如此

正在从文件解析json:

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

typeToken = new TypeToken<ArrayList<AdItem>>() {};
typeToken=newtypetoken(){};
所以
templast
应该只包含
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
i、 e

ArrayList tempList=gson.fromJson(jsonReader,TypeFactory.defaultInstance().ConstructionType(ArrayList.class,AdItem.class));

尝试调试,在LinkedTreeMap进入列表后立即设置断点。希望您的IDE/调试器能够创建这样复杂的断点。我将尝试一下,+1寻求帮助
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));