使用gson反序列化时,将TypeToken强制转换为Type时出错



我有一个类,它用这个函数反序列化泛型的ArrayList,就像这个线程的第一个答案中所描述的那样:Java抽象类函数泛型类型

public <T> ArrayList<T> arrayType(String data){
    return g.fromJson(data,   TypeToken.get(new ArrayList<T>().getClass()));
}

Eclipse要求我铸造TypeToken,结果是(因为Json的函数需要一个Type,而不是TypeToken)

public <T> ArrayList<T> arrayType(String data){
    return g.fromJson(data,  (Type) TypeToken.get(new ArrayList<T>().getClass()));
}

结果我得到了这个错误:

java.lang.ClassCastException: com.google.gson.reflect.TypeToken cannot be cast to java.lang.reflect.Type

在gson用户手册上,他们告诉你这是调用函数的正确方法

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
Collection<Integer> ints2 = gson.fromJson(json, collectionType);

我看不出我做错了什么(如果这是一个有效的答案,为什么我会得到这个转换错误?)

您正在调用TypeToken.get,它返回的是TypeToken,而不是Type。在您展示的示例中,它使用TypeToken.getType(),返回一个Type

所以你可以使用:

return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass()).getType());

这会给你一个Type,但它可能不是你真正想要的。特别是,由于类型擦除,无论您从呼叫站点指定什么T,都会返回相同的类型。如果您想让类型真正地反映ArrayList<T>,您需要将类传递到方法中,尽管我不完全确定该从哪里开始。(根据我的经验,当涉及到泛型时,Java反射API并不十分清楚。)

顺便说一句,我希望一个名为arrayType的方法与数组有关,而不是与ArrayList有关。

最新更新