通用方法,等式约束

fil*_*zyk 6 java generics

你好,我试图实现一个泛型方法作为控制器基方法,但我无法理解的问题发生在泛型方法签名上。

<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)

And*_*ner 6

您没有确切说明问题发生在哪里,但我认为这会在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。这排除了通用主体类型的使用,因为没有通用类文字。