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));