我有这段代码:
Type typeOfObjectsList = new TypeToken<ArrayList<myClass>>() {}.getType();
List<myClass> objectsList = new Gson().fromJson(json, typeOfObjectsList);
它将 JSON 字符串转换为 List
对象。但是现在我想让这个 ArrayList
具有动态类型(不仅仅是 myClass
),在运行时定义。
ArrayList
的项目类型将用 反射 定义。
我试过这个:
private <T> Type setModelAndGetCorrespondingList2(Class<T> type) {
Type typeOfObjectsListNew = new TypeToken<ArrayList<T>>() {}.getType();
return typeOfObjectsListNew;
}
但它不起作用。这是例外:
java.sql.SQLException: Fail to convert to internal representation: {....my json....}
原文由 Amin Sh 发布,翻译遵循 CC BY-SA 4.0 许可协议
您建议的语法无效。以下
无效,因为您正试图在需要类型名称的地方传递方法调用。
以下
由于泛型(类型擦除)和反射的工作方式,这是不可能的。整个
TypeToken
hack 有效,因为Class#getGenericSuperclass()
执行以下操作换句话说,如果它看到
ArrayList<T>
,那就是ParameterizedType
它会返回,你将无法提取类型变量T
的编译时值---
本来有。Type
和ParameterizedType
都是接口。您可以提供您自己的实现实例(定义一个实现任一接口并覆盖其方法的类)或使用TypeToken
在其最新版本中提供的一种有用的工厂方法。例如,