9

我有一个类,它使用此函数反序列化泛型的 ArrayList,正如该线程的第一个答案中所述:Java 抽象类函数泛型类型

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

Eclipse 要求我转换 TypeToken 导致这个(sinde 函数 fromJson 需要一个类型,而不是一个 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);

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

4

1 回答 1

13

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

所以你可以使用:

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

...这会给你一个Type,但它可能不是你真正想要的。特别是,由于类型擦除,无论T您从调用站点指定什么,都会返回相同的类型。如果您希望类型真正反映ArrayList<T>,则需要将类传递给方法,尽管我不完全确定从那里去哪里。(根据我的经验,在泛型方面,Java 反射 API 并不是很清楚。)

顺便说一句,我希望调用的方法arrayType数组有关,而不是ArrayList.

于 2012-07-14T19:30:26.510 回答