Class <T>不接受ParameterizedTypeReference

时间:2019-08-22 01:32:17

标签: java spring java-ee

我正在将现有代码迁移到超类/子类情况。见下文。

父类中的方法:

    public <T> ResponseEntity<T> makeRequest(HttpMethod method, String endpoint, HttpEntity<?> request, Class<T> responseType) {
        //DO stuff here
    }

在子类中,有一个对上面的makeRequest()的调用。

    ParameterizedTypeReference<List<MyOtherClass>> typeRef = new ParameterizedTypeReference<List<MyOtherClass>>() {};
    ResponseEntity<List<MyOtherClass>> response = makeRequest(HttpMethod.GET,uriComponents.toUriString(), request, typeRef);

但是最后一个参数似乎导致签名不匹配。 Eclipse这样说。

“ ParentWS类型的方法makeRequest(HttpMethod,String,HttpEntity,Class)不适用于参数(HttpMethod,String,HttpEntity,ParameterizedTypeReference>)”

我不明白为什么,父方法签名指出任何类型的任何类。像这样,所有其他子类都只需调用 String.class 来调用父方法。

response = makeRequest(HttpMethod.GET, healthCheckUrlEndpoint, request, String.class);

但是为什么 ParameterizedTypeReference>(){} 引起问题? 我以前从未使用过ParameterizedTypeReference,它对我来说是全新的。请告知。

3 个答案:

答案 0 :(得分:0)

我要理解的第四个参数是Class类型。尝试typeRef.getClass()

答案 1 :(得分:0)

首先,方法签名像Class中所说的java.lang.Class,所以您应该使用typeRef.getClass()来传递typeRef类的实例而不是ParametrizedClassReference的实例。

那行不通。

makeRequest应该返回ResponseEntity<T>。 Java编译器将根据方法参数推断 T 的确切含义。如果将最后一个参数更改为typeRef.getClass(),则Java将期望方法返回ResponseEntity<ParametrizedClassReference<List<MyOtherClass>>

我将在这里做一个疯狂的猜测。您的makeRequest看起来像是RestTemplate.exchange()的包装器,所以也许使用实际上接受exchange()的{​​{1}}的重载版本?

您可能想创建ParameterizedTypeReference的重载版本以同时接受makeRequest

答案 2 :(得分:0)

根据方法定义:-

public <T> ResponseEntity<T> makeRequest(HttpMethod method, String endpoint, HttpEntity<?> request, Class<T> responseType);

编译器希望将通用类型Class<T>作为参数。但是您尝试使用其他通用类型ParametrizedClassReference<T>作为参数。因此它将无法编译。

我在内部假设makeRequest方法调用RestTemplate#exchange方法之一。将ParametrizedClassReference<T>的参数类型更改为Class<T>,以使编译工作。例如:-

Class<? extends List> classes = (new ArrayList<MyOtherClass>()).getClass();
ResponseEntity<List<MyOtherClass>> response = makeRequest(HttpMethod.GET,uriComponents.toUriString(), request, classes);