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

时间:2018-04-17 14:25:29

标签: spring-mvc generics methods collections types

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

public class OperationalDataResponse<T> {

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

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

在客户端,我使用添加了RestTemplate的{​​{1}}。 我从服务中得到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) 是一个集合(例如,resultTypeList<String>) 然后我不知道如何从调用者代码传递List<MyNonGenericClass>类。

例如,来自来电者代码,

resultType

getOperationalData(someResourcePath, someUrlVariables, List.class)

抛出编译错误。

我也试过传递getOperationalData(someResourcePath, someUrlVariables, List<MyNonGenericClass>.class) ,但这也不起作用。

任何建议如何从调用者代码传递通用集合作为ArrayList.class(换句话说,作为示例,我如何传递resultType或{{1}的类对象来自来电者代码?)

1 个答案:

答案 0 :(得分:0)

如果您知道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());
}