【发布时间】:2017-08-07 19:12:34
【问题描述】:
我有一个简单的泛型类:
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吗?
【问题讨论】:
-
看起来你应该在
deserialize1方法中使用new TypeToken<OwnedCollection<T>>而不是new TypeToken<T> -
@IvanPronin 我能够以这种方式序列化它,但不能在适当的对象中。当我尝试在泛型类中调用某些方法时,我也得到 java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to org.miracledojo.karatedo.domen.BaseObject
标签: java json generics gson generic-programming