You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:47:29