如何获取已实例化泛型类型的java.lang.reflect.Type?
用Gson处理泛型列表的类型适配器注册方案
Java的泛型擦除机制确实让我们无法直接通过List<SomeClass>.class这种写法获取带具体泛型参数的类型对象,但Gson提供的TypeToken类可以完美解决这个问题,它能在编译时捕获泛型类型信息。
具体实现方式
- 针对你的两种具体泛型列表类型,分别用
TypeToken的匿名子类获取对应的Type对象:
// 假设第一种具体类型是FirstItem Type listOfFirstItem = new TypeToken<List<FirstItem>>() {}.getType(); // 第二种具体类型是SecondItem Type listOfSecondItem = new TypeToken<List<SecondItem>>() {}.getType();
- 把这两个
Type对象分别和对应的适配器绑定注册:
Gson gson = new GsonBuilder() .registerTypeAdapter(listOfFirstItem, new FirstItemListAdapter()) .registerTypeAdapter(listOfSecondItem, new SecondItemListAdapter()) .create();
为什么这个方法可行
TypeToken借助了Java匿名内部类的特性:当你创建TypeToken<List<FirstItem>>的匿名子类时,编译器会把这个具体的泛型参数信息保留在子类的字节码中,运行时通过getType()方法就能反射获取到完整的泛型类型,正好匹配GsonregisterTypeAdapter方法所需的Type参数。
内容的提问来源于stack exchange,提问作者Deling Ren
相关产品推荐
相关产品推荐

