【问题标题】:cannot select Parameterized Type无法选择参数化类型
【发布时间】:2014-11-18 17:23:18
【问题描述】:

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

下面给出的构造函数:

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。

【问题讨论】:

  • 与其告诉我们它“不工作”,不如发布编译器错误。我认为问题出在ResultContainData&lt;Boolean&gt;.class,对吧?
  • 正如@John 所写,没有 ResultContainData.class 这样的东西,试试 ResultContainData.class
  • 是的,编译错误是cannot select Parameterized Type

标签: java spring


【解决方案1】:

我找到了解决方案。

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

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

【讨论】:

【解决方案2】:

您只能通过在子类定义中捕获 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    相关资源
    最近更新 更多