一尘不染

Java具有动态ArrayList项类型的Gson TypeToken

java

我有以下代码:

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....}


阅读 548

收藏
2020-03-01

共1个答案

一尘不染

你提出的语法无效。下列

new TypeToken<ArrayList<Class.forName(MyClass)>>

之所以无效,是因为你试图传递期望类型名称的方法调用。

下列

new TypeToken<ArrayList<T>>() 

由于泛型(类型擦除)和反射的工作方式,因此无法实现。整个TypeToken黑客工作,因为Class#getGenericSuperclass()以下

返回表示该类表示的实体的直接超类的Type(类,接口,原始类型或void)。

如果超类是参数化类型,则返回的Type对象必须准确反映源代码中使用的实际类型参数。

换句话说,如果看到ArrayList<T>ParameterizedType那么它将返回,并且你将无法提取类型变量T本应具有的编译时间值。

Type和ParameterizedType都是接口。你可以提供自己的实现的实例。

2020-03-01