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

时间:2012-07-14 19:26:34

标签: java eclipse generics casting gson

我有一个类使用此函数反序列化泛型的ArrayList,正如此线程的第一个答案所述:Java abstract class function generic Type

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 user manual他们告诉你这是调用函数的正确方法

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

我无法看到我做错了什么(如果这是一个有效的答案,为什么我会收到这个演员错误?)

1 个答案:

答案 0 :(得分:10)

你正在呼叫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