3

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

家长班方法:

    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,它对我来说是全新的。请指教。

4

3 回答 3

0

我们我理解第四个参数是类类型。试试typeRef.getClass()

于 2019-08-22T02:05:53.983 回答
0

首先,方法签名表示Class为 in java.lang.Class,因此您应该使用typeRef.getClass()传递 typeRef 类的实例而不是ParametrizedClassReference.

但这行不通。

makeRequest应该返回ResponseEntity<T>。Java 编译器将根据方法参数推断T到底是什么。如果您将最后一个参数更改为typeRef.getClass()Java 将期望方法返回ResponseEntity<ParametrizedClassReference<List<MyOtherClass>>

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

您可能还想创建makeRequest接受ParameterizedTypeReference的重载版本。

于 2019-08-22T02:15:32.167 回答
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);
于 2019-08-22T10:32:27.310 回答