【发布时间】:2017-07-13 19:31:04
【问题描述】:
我有一个叫做adapt的方法,但我不知道T和?之间的确切区别。
对我来说,adapt 必须接受 any class。
public void getRequestor(Long requestorId, ResponseHandler<RequestorResponse> handler){
String url = this.serviceUrl;
//Error happens in this.adapt...
RestClient.url(url).get(null).onResponse(this.adapt(handler), RequestorResponse.class);
}
private <T> RestClient.ResponseHandler<T> adapt(ResponseHandler<T> handler){
return new RestClient.ResponseHandler<T>() {
@Override
public void onResponse(ResponseEntity<T> response) {
if(response.getStatusCode().is2xxSuccessful()) {
handler.onResponse(response.getBody());
return;
}
handler.onError(new com.sensedia.api.interfaces.Error(String.valueOf(response.getStatusCodeValue())));
}
};
}
RestClient 类
public class RestClient {
private final String url;
private RestClient(String url) {
this.url = url;
}
public static RestClient url(String url) {
return new RestClient(url);
}
//Others methods
@FunctionalInterface
public interface ResponseHandler<T> {
void onResponse(ResponseEntity<T> var1);
}
public static class PagedOperation<T> extends AbstractOperation<T, RestClient.PagedOperation<T>> {
private final RestClient.Limit limit;
private final RestClient.Offset offset;
public PagedOperation(String url, RestClient.Limit limit, RestClient.Offset offset) {
super(url);
this.limit = limit;
this.offset = offset;
}
public void onResponse(RestClient.ResponseHandler<T> handler, Class<T> type) {
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(this.url()).queryParam("_limit", new Object[]{this.limit.get()}).queryParam("_offset", new Object[]{this.offset.get()});
ResponseEntity<T> response = this.client().getForEntity(builder.build().encode().toUri(), type);
handler.onResponse(response);
}
}
}
但是我不能通过这个handler。为什么会发生这种情况?
错误
不兼容的类型:推断的类型不符合相等 约束 [ERROR] 推断:java.lang.Object [ERROR] 相等 约束:java.lang.Object,com.daniela.infra.RequestorResponse
【问题讨论】:
-
this指的是什么? -
您在那里调用的
onResponse方法的定义是什么?这不是你在上面显示的那个,这个有两个参数。 -
RestClient 是一个使用 Spring 的 RestTemplate 的类,很容易用它进行 API 分页。
-
RestClient.url(url).get(null)如何变成RestClient<RequestorResponse>?我猜你必须以某种方式暗示,例如铸造空值:....get((RequestorResponse) null). -
请显示
RestClient.url和(whatever that type is).get方法的定义。