[英]Error casting TypeToken to Type when deserializing with gson
我有一個類使用此函數反序列化泛型的ArrayList,正如此線程的第一個答案所述: Java抽象類函數泛型類型
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用戶手冊中,他們告訴您這是調用該函數的正確方法
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
說一句,我希望一個名為arrayType
的方法與數組有關 ,而不是ArrayList
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.