本文讲解如何通过泛型方法改造,解决TinyDB等第三方库中getListObject()返回ArrayList<Object>导致的类型不匹配问题,使ArrayList<Pet>能正确接收反序列化结果。
本文讲解如何通过泛型方法改造,解决tinydb等第三方库中`getlistobject()`返回`arraylist`导致的类型不匹配问题,使`arraylist`能正确接收反序列化结果。
在Android开发中,使用Gson序列化/反序列化自定义对象(如Pet类)并存入本地数据库(如TinyDB)时,常遇到类型擦除引发的编译错误:
Required type: ArrayList<Pet>
Provided: ArrayList<Object>
根本原因在于原始实现中,getListObject()方法声明返回ArrayList<Object>,而Java泛型是类型擦除的——编译期无法保证运行时类型安全,导致ArrayList<Object>无法赋值给ArrayList<Pet>(二者不是协变关系,ArrayList<Pet> ≠ ArrayList<Object>)。
将原方法签名从非泛型改为带类型参数 <T> 的泛型方法,让编译器能推断并校验实际类型:
立即学习“Java免费学习笔记(深入)”;
public <T> ArrayList<T> getListObject(String key, Class<T> mClass) { Gson gson = new Gson(); ArrayList<String> objStrings = getListString(key); ArrayList<T> objects = new ArrayList<>(); // 使用钻石运算符,自动推导T for (String jObjString : objStrings) { T value = gson.fromJson(jObjString, mClass); // Gson.fromJson() 也支持泛型返回 objects.add(value); } return objects;}
ArrayList<Pet> petList = new ArrayList<>();TinyDB tinydb = new TinyDB(getContext());petList = tinydb.getListObject("PETS", Pet.class); // ✅ 编译通过,类型精确匹配
通过这一改造,你不仅解决了编译错误,更实现了类型安全、可读性强、无需类型转换的健壮代码设计——这是Java泛型在真实工程场景中的典型最佳实践。