你好,我试图实现一个泛型方法作为控制器基方法,但我无法理解的问题发生在泛型方法签名上。
<T> ResponseEntity<T> makeApiCall(String path, HttpMethod httpMethod, T body, boolean isAdmin){
String sender = isAdmin ? adminHash : userHash;
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", sender);
headers.add("Content-Type", "application/json");
HttpEntity<T> entity = new HttpEntity<>(body,headers);
ResponseEntity<T> responseEntity = restTemplate.exchange(path, HttpMethod.POST, entity, body.getClass());
return responseEntity;
}
Run Code Online (Sandbox Code Playgroud)
我目前的编译错误如下:
Incompatible equality constraint: T and capture of ? extends Object
Run Code Online (Sandbox Code Playgroud)
您没有确切说明问题发生在哪里,但我认为这会在restTemplate.exchange(调用时发生,因为body.getClass()作为参数传递。这是因为 的返回类型body.getClass()is Class<? extends Object>,如 Javadoc 中所示:
实际的结果类型是
Class<? extends |X|>在哪里|X|是getClass被调用的表达式的静态类型的擦除
问题是你不能保证它body是特定的T- 它可能是T. 因此, 的结果body.getClass()可能不是Class<T>.
如果您想要类型安全,则需要将其作为附加参数传递给方法。
<T> ResponseEntity<T> makeApiCall(
String path, HttpMethod httpMethod, T body, Class<T> bodyClass,
boolean isAdmin){
// ...
ResponseEntity<T> responseEntity =
restTemplate.exchange(
path, HttpMethod.POST, entity, bodyClass);
// ...
}
Run Code Online (Sandbox Code Playgroud)
请注意,获得 a 的唯一方法Class<T>是使用类文字,例如String.classif Tis String。这排除了通用主体类型的使用,因为没有通用类文字。