【问题标题】:generic method passing parramaters - java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap泛型方法传递参数 - java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap
【发布时间】: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&lt;OwnedCollection&lt;T&gt;&gt; 而不是 new TypeToken&lt;T&gt;
  • @IvanPronin 我能够以这种方式序列化它,但不能在适当的对象中。当我尝试在泛型类中调用某些方法时,我也得到 java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to org.miracledojo.karatedo.domen.BaseObject

标签: java json generics gson generic-programming


【解决方案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());
}

【讨论】:

  • 我能够以这种方式序列化它,但不能在适当的对象中。当我尝试在泛型类中调用某些方法时,我也得到 java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to org.miracledojo.karatedo.domen.BaseObject
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多