我有一个类,它用这个函数反序列化泛型的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
有关。