如何将泛型集合类对象作为参数传递

3
我是一位有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我使用基于Spring MVC的RESTful服务。 该服务具有RESTful资源方法,返回以下响应:

public class OperationalDataResponse<T> {

    private String status;
    private String statusMessage;
    private T result;
    //getters and setters   
}

这个响应对象封装了类型为 T 的结果对象。

在客户端,我使用添加了 GsonHttpMessageConverterRestTemplate。 我将服务的响应作为 ResponseEntity 获取。

我通过运行时的 Type 处理通用响应,如下所示:

public class OperationalDataRestClient<REQ,RESULT_TYPE> {

    public OperationalDataResponse<RESULT_TYPE> getOperationalData(String resourcePath, Map<String, Object> urlVariables, Class<RESULT_TYPE> resultType) {  
        //code to invoke service and get data goes here 
        String responseString = responseEntity.getBody();
        response = GsonHelper.getInstance().fromJson(responseString, getType(OperationalDataResponse.class, resultType));    
    }


    Type getType(final Class<?> rawClass, final Class<?> parameter) {
        return new ParameterizedType() {
            @Override
            public Type[] getActualTypeArguments() {
                return new Type[] { parameter };
            }
            @Override
            public Type getRawType() {
                return rawClass;
            }   
            @Override
            public Type getOwnerType() {
                return null;
            }
        };
    }
}

只要我的resultType不是集合类,这就像魔法一样好用。因此,从调用者代码使用起来非常棒。
getOperationalData(someResourcePath, someUrlVariables, MyNonGenericClass.class)

然而,如果我的 `resultType` 是一个集合(比如 `List` 或 `List`),那么我不知道如何从调用者代码中传递 `resultType` 类的参数。
例如,从调用者代码中:
getOperationalData(someResourcePath, someUrlVariables, List.class)

getOperationalData(someResourcePath, someUrlVariables, List<MyNonGenericClass>.class)

抛出编译错误。

我尝试传递 ArrayList.class 也不起作用。

有什么建议可以将泛型集合作为resultType从调用者代码传递(换句话说,例如,如何从调用者代码传递List<String>List<MyNonGenericClass>的类对象?)

1个回答

0

如果你知道ResultType是以List的形式出现的,那么很明显会像你所说的编译错误一样失败。为什么?因为你试图发送一个List,而你的方法只接受单个值。为了克服这个问题,你需要将方法参数更改为以下内容:

public OperationalDataResponse<RESULT_TYPE> getOperationalData(String resourcePath, Map<String, Object> urlVariables, List<Class<RESULT_TYPE>> resultType){
    ....
}

你需要对getType()方法进行一些微小的修改,循环并将每个类的值传递给getType方法,就像这样

for(MyNonGenericClass myClass:mylist){
    getType(OperationalDataResponse.class, myClass.getClass());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接