2

我有我正在重构的代码:

    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);
4

1 回答 1

2

使用参数这是不可能的Class<T>,因为Class仅支持表示原始类型,例如List- 类型List<GameInfo>不能由Class对象表示,这就是TypeToken存在的原因。

您的方法需要TypeToken<T>取而代之的是一个参数,并将其留给调用者来创建该参数:

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)

于 2012-05-14T16:52:19.077 回答