我有以下代码:
Type typeOfObjectsList = new TypeToken<ArrayList<myClass>>() {}.getType(); List<myClass> objectsList = new Gson().fromJson(json, typeOfObjectsList);
它将JSON字符串转换List为对象的。但是,现在我想让它具有在运行时定义ArrayList的动态类型(而不仅仅是myClass)。
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....}
你提出的语法无效。下列
new TypeToken<ArrayList<Class.forName(MyClass)>>
之所以无效,是因为你试图传递期望类型名称的方法调用。
下列
new TypeToken<ArrayList<T>>()
由于泛型(类型擦除)和反射的工作方式,因此无法实现。整个TypeToken黑客工作,因为Class#getGenericSuperclass()以下
Class#getGenericSuperclass()
返回表示该类表示的实体的直接超类的Type(类,接口,原始类型或void)。
如果超类是参数化类型,则返回的Type对象必须准确反映源代码中使用的实际类型参数。
换句话说,如果看到ArrayList<T>,ParameterizedType那么它将返回,并且你将无法提取类型变量T本应具有的编译时间值。
ArrayList<T>
ParameterizedType
Type和ParameterizedType都是接口。你可以提供自己的实现的实例。