使用自定义Pet类创建ArrayList调用第三方库方法时类型不匹配报错
解决TinyDB getListObject类型不匹配问题
问题根源:第三方库TinyDB的getListObject方法返回的是ArrayList<Object>,而你需要的是ArrayList<Pet>,Java泛型的编译时类型检查不允许直接赋值,因此出现类型不匹配错误。
以下是三种可行的解决方法:
方法一:手动遍历转换(安全可靠,适用于无法修改TinyDB源码的场景)
创建目标类型的ArrayList,遍历返回的Object列表,逐个转换并添加(加类型检查避免异常):
TinyDB tinydb = new TinyDB(getContext()); ArrayList<Object> tempList = tinydb.getListObject("PETS", Pet.class); ArrayList<Pet> petList = new ArrayList<>(); for (Object obj : tempList) { if (obj instanceof Pet) { petList.add((Pet) obj); } }
方法二:修改TinyDB源码为泛型方法(最优雅,需有权限修改源码)
将原getListObject方法改为泛型方法,直接返回指定类型的ArrayList:
public <T> ArrayList<T> getListObject(String key, Class<T> mClass){ Gson gson = new Gson(); ArrayList<String> objStrings = getListString(key); ArrayList<T> objects = new ArrayList<>(); for(String jObjString : objStrings){ T value = gson.fromJson(jObjString, mClass); objects.add(value); } return objects; }
修改后直接调用即可,无需额外转换:
TinyDB tinydb = new TinyDB(getContext()); ArrayList<Pet> petList = tinydb.getListObject("PETS", Pet.class);
方法三:强制类型转换(不推荐,存在运行时风险)
通过双重转换绕过编译检查,但会产生unchecked警告,且若列表中存在非Pet对象会抛出ClassCastException:
TinyDB tinydb = new TinyDB(getContext()); @SuppressWarnings("unchecked") ArrayList<Pet> petList = (ArrayList<Pet>) (ArrayList<?>) tinydb.getListObject("PETS", Pet.class);
额外注意点
你的Pet类包含Bitmap字段,Gson默认无法序列化/反序列化Bitmap,后续存储或读取时可能出现错误,需要为Bitmap自定义TypeAdapter来处理序列化逻辑。
内容的提问来源于stack exchange,提问作者yogurtik
相关产品推荐
相关产品推荐

