2017-08-07 55 views
3

我有一個簡單的泛型類:泛型方法傳遞parramaters - java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap

public class OwnedCollection<T extends BaseObject> extends BaseObject { 

    private String playerId; 
    private List<T> collection; 


public OwnedCollection(String playerId, List<T> collection) { 
    super(playerId); 
    this.playerId = playerId; 
    this.collection = collection; 
} 

}

我想從JSON反序列化。我使用GSON庫,所以 當我打電話行:

OwnedCollection<Skin> fromJson = new Gson().fromJson(json, new TypeToken<OwnedCollection<Skin>>() {}.getType()); 

一切工作正常。

但是,當我嘗試創建一個方法來做到這一點,我得到例外。 我曾嘗試以下:

public <T extends BaseObject> OwnedCollection<T> deserialize1(String json, Class<T> type) { 
    Gson gson = new Gson(); 
    return gson.fromJson(json, new TypeToken<T>() { 
    }.getType()); 
} 

,並調用它:

OwnedCollection<Skin> deserialize1 = deserialize1(json, Skin.class); 

我得到:

java.lang.ClassCastException: org.miracledojo.karatedo.domen.item.Skin cannot be cast to org.miracledojo.karatedo.domen.item.OwnedCollection 

則:

public <T extends BaseObject> OwnedCollection<T> deserialize2(String json, Type type) { 
    Gson gson = new Gson(); 
    return gson.fromJson(json, type); 
} 

,並調用它:

deserialize2(json, Skin.class); 

然後我得到:

java.lang.ClassCastException: org.miracledojo.karatedo.domen.item.Skin cannot be cast to org.miracledojo.karatedo.domen.item.OwnedCollection 

沒有任何人有什麼想法? 喜歡的東西:

OwnedCollection<Skin>.class 

是不可能的,所以任何類似sintax?

+1

看起來你應該在你的'deserialize1'使用'新TypeToken >'方法,而不是'新的TypeToken ' –

+0

@IvanPronin我可以序列化它的方式,但不是在適當的對象。當我嘗試調用泛型類中的某個方法時,我也得到java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap無法轉換爲org.miracledojo.karatedo.domen.BaseObject –

回答

1

你給的GSON解析器的類型不正確的道理,改變類型令牌是T類型的OwnedCollection

public <T extends BaseObject> OwnedCollection<T> deserialize1(String json, Class<T> type) { 
    return new Gson().fromJson(json, new TypeToken<OwnedCollection<T>>(){}.getType()); 
} 
+0

我可以序列化它這種方式,但沒有在適當的對象。當我嘗試調用泛型類中的某些方法時,我也在獲取java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap無法轉換爲org.miracledojo.karatedo.domen.BaseObject –