2012-07-14 62 views
7

我有一個反序列化泛型的ArrayList,也是同樣在這個線程的第一個答案描述這個函數的類:Java abstract class function generic Type錯誤鑄造TypeToken與GSON反序列化時,鍵入

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 user manual他們會告訴你這是在調用該函數

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType(); 
Collection<Integer> ints2 = gson.fromJson(json, collectionType); 

的正確方法,我看不出有什麼我做錯了(如果它是一個有效的答案,爲什麼我得到這個投錯誤?)

+1

'new ArrayList ().getClass()'與'ArrayList.class'完全一樣, – newacct 2012-07-15 00:49:39

回答

10

那麼你打電話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

+0

waw,這很快,我正在測試它。無論如何感謝提前。 – dinigo 2012-07-14 21:29:27

+0

我終於必須將該類型作爲參數傳遞。你給我的分析我的JSON沒有任何警告或錯誤,但最終它不讓我訪問ArrayList的每個元素。即使長度正確並且'toString()'方法有效,它只是無法訪問它們。 – dinigo 2012-08-01 00:19:16