我有一个使用此函数反序列化泛型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导致这种情况(因为fromJson的函数需要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);
并且我看不到我在做什么错(如果这是一个有效的答案,为什么我会收到此强制转换错误?)
最佳答案
好吧,您正在调用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
。