【问题标题】:How to pass a generic collection Class object as an argument如何将泛型集合类对象作为参数传递
【发布时间】:2018-09-27 13:48:51
【问题描述】:

我有基于 Spring MVC 的 RESTful 服务。 该服务有一个返回以下响应的 RESTful 资源方法:

public class OperationalDataResponse<T> {

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

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

在客户端,我使用RestTemplate 并添加了GsonHttpMessageConverter。 我以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&lt;String&gt;List&lt;MyNonGenericClass&gt;) 那么我不知道如何从调用者代码中传递resultType 类。

例如,来自调用者代码,

getOperationalData(someResourcePath, someUrlVariables, List.class)

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

引发编译错误。

我也尝试过传递ArrayList.class,但这也不起作用。

任何建议如何将通用集合作为resultType 从调用者代码传递(换句话说,例如,我如何从调用者代码传递List&lt;String&gt;List&lt;MyNonGenericClass&gt; 的类对象?)

【问题讨论】:

    标签: spring-mvc generics methods collections types


    【解决方案1】:

    如果你知道 ResultType 是以 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());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 2019-02-27
      • 2021-06-24
      • 2013-05-05
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多