【问题标题】:Specifying generic type information through a parameter通过参数指定泛型类型信息
【发布时间】:2012-05-15 01:16:36
【问题描述】:

我正在重构这段代码:

    if (response != null) {
        Type collectionType = new TypeToken<List<GameInfo>>() {}.getType();
        Gson gson = new Gson();
        return (List<GameInfo>) gson.fromJson(response, collectionType);
    }

我可以创建一个“列表”部分可以是任何集合类型的函数吗?

非法代码示例:

private <T> T collectionFromJson(String pResponseJson, Class<T> pCollectionClass) {
    T result = null;
    Type collectionType = new TypeToken<pCollectionClass>() {
    }.getType();
    ...
    return result;
}

非法调用非法代码的示例,说明了我的目标:

return collectionFromJson(response, List<GameInfo>.class);

【问题讨论】:

标签: java generics


【解决方案1】:

使用Class&lt;T&gt; 参数是不可能的,因为Class 只支持表示像List 这样的原始类型——List&lt;GameInfo&gt; 类型不能用Class 对象表示,这就是为什么TypeToken 存在。

您的方法需要采用 TypeToken&lt;T&gt; 参数,并将其留给调用者来创建该参数:

private <T extends Collection<U>, U> T collectionFromJson(String pResponseJson, TypeToken<T> typeToken) {
    return (T)new Gson().fromJson(pResponseJson, typeToken.getType());
}

...

TypeToken<List<GameInfo>> typeToken = new TypeToken<List<GameInfo>>() { };
List<GameInfo> lst = collectionFromJson(response, typeToken);

(免责声明:我只有 Java/泛型的经验,没有 GSON)

【讨论】:

  • 好的,这是有道理的。我会试一试。 GSON 部分对这个问题来说是多余的。
  • 采用Type 参数会更通用,您可以直接将其传递给fromJson()。然后调用者可以传递一个Class,或者传递typeToken.getType() 的结果,或者传递一个以其他方式生成的Type,这取决于它想要什么
  • @newacct - 没错,但它不会失去TypeToken 提供的编译时类型安全性吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 2023-03-18
  • 2011-11-26
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多