我想创建一个休息来在服务器和客户端之间进行通信.
下面给出的构造函数:
public class RestHelper<I, R> {
public RestHelper(String url, I input, Class<R> output){
ResponseEntity<R> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, output );
}
}
Run Code Online (Sandbox Code Playgroud)
对于普通类型,我可以这样做:
RestHelper<User, Result> helper = new RestHelper<>(url, user, Result.class);
Run Code Online (Sandbox Code Playgroud)
我如何传递泛型类型,如:
ResultContainData<Boolean>
Run Code Online (Sandbox Code Playgroud)
以下代码无效:
ResultContainData<Boolean> result = new ResultContainData<>();
RestHelper<User, ResultContainData<Boolean>> helper = new RestHelper<>(url, user, (Class<ResultContainData<Boolean>>) ((ParameterizedType) result.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
Run Code Online (Sandbox Code Playgroud)
我收到了运行时错误:无法转换为ParameterizedType.
Mic*_*ael 11
我得到了解决方案.
ResultContainData<Boolean> result = new ResultContainData<>();
RestHelper<User, ResultContainData<Boolean>> helper = new RestHelper<>(url, user, (Class<ResultContainData<Boolean>>)result.getClass());
Run Code Online (Sandbox Code Playgroud)
它对我有用.我仍在寻找更好的解决方案.
您只能通过在子类定义中捕获它们来学习I和R的值 - 否则它们将在运行时被擦除.例如:
class MyStringRestHelper extends RestHelper<String, String> {
Run Code Online (Sandbox Code Playgroud)
然后使用类似TypeTools的东西,你可以解析I和R的值:
Class<?>[] typeArgs = TypeResolver.resolveRawArguments(RestHelper.class, MyStringRestHelper.class);
Class<?> i = typeArgs[0];
Class<?> r = typeArgs[1];
assert i == r == String.class;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21424 次 |
| 最近记录: |