我有一个类使用此函数反序列化泛型的 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 的函数需要类型,而不是 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);
而且我看不出我做错了什么(如果这是一个有效的答案,为什么我会收到这个转换错误?)
最佳答案
好吧,你调用TypeToken.get
,它返回一个 TypeToken
- 不是 Type
.在您展示的示例中,它使用的是 TypeToken.getType()
,它返回一个 Type
.
所以你可以使用:
return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass()).getType());
... 这会返回一个 Type
,但它可能不是您真正想要的。特别是,由于类型删除,无论什么类型都会返回相同的类型 T
您从调用站点指定。如果您希望类型真正反射(reflect)ArrayList<T>
,您需要将类传递到方法中,尽管我不完全确定从那里去哪里。 (根据我的经验,Java 反射 API 在涉及泛型时并不是很清楚。)
顺便说一句,我希望有一个名为 arrayType
的方法与数组有关,而不是ArrayList
.
关于java - 使用 gson 反序列化时将 TypeToken 转换为 Type 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486764/