我正在将现有代码迁移到超类/子类情况。见下文。
父类中的方法:
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,它对我来说是全新的。请告知。
答案 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);