无法选择参数化类型

时间:2014-11-18 17:23:19

标签: java spring

我想创建一个休息来在服务器和客户端之间进行通信。

下面给出的构造函数:

public class RestHelper<I, R> {
    public RestHelper(String url, I input, Class<R> output){
        ResponseEntity<R> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, output );
    }
}

对于普通类型,我可以这样做:

RestHelper<User, Result> helper = new RestHelper<>(url, user, Result.class);

如何传递泛型类型,例如:

ResultContainData<Boolean>

以下代码无效:

    ResultContainData<Boolean> result = new ResultContainData<>();
    RestHelper<User, ResultContainData<Boolean>> helper = new RestHelper<>(url, user, (Class<ResultContainData<Boolean>>) ((ParameterizedType) result.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);

我遇到了运行时错误:无法转换为ParameterizedType。

2 个答案:

答案 0 :(得分:8)

我得到了解决方案。

ResultContainData<Boolean> result = new ResultContainData<>();
RestHelper<User, ResultContainData<Boolean>> helper = new RestHelper<>(url, user, (Class<ResultContainData<Boolean>>)result.getClass());

这对我有用。我仍在寻找更好的解决方案。

答案 1 :(得分:6)

您只能通过在子类定义中捕获它们来学习I和R的值 - 否则它们会在运行时被擦除。例如:

class MyStringRestHelper extends RestHelper<String, String> {

然后使用类似TypeTools的内容,您可以解析I和R的值:

Class<?>[] typeArgs = TypeResolver.resolveRawArguments(RestHelper.class, MyStringRestHelper.class);
Class<?> i = typeArgs[0];
Class<?> r = typeArgs[1];
assert i == r == String.class;