Java 通过参数指定泛型类型信息

Java 通过参数指定泛型类型信息,java,generics,Java,Generics,我有我正在重构的代码: if (response != null) { Type collectionType = new TypeToken<List<GameInfo>>() {}.getType(); Gson gson = new Gson(); return (List<GameInfo>) gson.fromJson(response, collectionType); } if(响

我有我正在重构的代码:

    if (response != null) {
        Type collectionType = new TypeToken<List<GameInfo>>() {}.getType();
        Gson gson = new Gson();
        return (List<GameInfo>) gson.fromJson(response, collectionType);
    }
if(响应!=null){
Type collectionType=new-TypeToken(){}.getType();
Gson Gson=新的Gson();
return(List)gson.fromJson(response,collectionType);
}
我可以创建一个函数,其中“列表”部分可以是任何集合类型吗

非法代码示例:

private <T> T collectionFromJson(String pResponseJson, Class<T> pCollectionClass) {
    T result = null;
    Type collectionType = new TypeToken<pCollectionClass>() {
    }.getType();
    ...
    return result;
}
private T collectionFromJson(字符串pResponseJson,类pCollectionClass){
T结果=null;
Type collectionType=new-TypeToken(){
}.getType();
...
返回结果;
}
对非法代码的非法调用示例说明了我的拍摄目的:

return collectionFromJson(response, List<GameInfo>.class);
返回collectionFromJson(响应,List.class);

使用
参数是不可能的,因为
只支持表示原始类型,如
列表
——类型
列表
不能由
对象表示,这就是
类型标记
存在的原因

您的方法需要采用
TypeToken
参数,并由调用方创建该参数:

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);
private T collectionFromJson(字符串pResponseJson,TypeToken-TypeToken){
返回(T)new Gson().fromJson(pResponseJson,typeToken.getType());
}
...
TypeToken TypeToken=新的TypeToken(){};
List lst=collectionFromJson(响应,类型令牌);

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

好的,这很有意义。我要试一试。GSON部分对于这个问题来说是多余的。更一般的做法是采用
类型
参数,您可以直接将其传递到
fromJson()
。然后,调用方可以传递一个
,或者传递
typeToken.getType()
的结果,或者传递以其他方式生成的
类型
,具体取决于调用的内容wants@newacct-这是真的,但它不会失去
TypeToken
提供的编译时类型安全性吗?您的问题与此非常相关: