2017-07-13 51 views
1

我有这种方法调用适应,我不知道T和?之间的确切区别。与T不兼容的类型

对我来说,改编必须接受任何类别

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

但我不能接受这处理。为什么会发生?

错误

不兼容的类型:类型推断出不符合平等 约束(s)实施ERROR]推断:java.lang.Object中[ERROR]平等 约束(或多个):java.lang中。对象,com.daniela.infra.RequestorResponse

+1

是什么'this'指什么? – marstran

+0

你在那里打电话的“onResponse”方法的定义是什么?这不是你显示更高的那个,这个有两个参数。 –

+0

RestClient是一个使用Spring的RestTemplate的类,它很容易使用API​​进行分页。 –

回答

-1

好像你正试图定义的类RequestorResponse传递到泛型类型this.adapt(handler)

ResponseHandler所< RequestorResponse>处理

的Java不会让你因为你的泛型类型T可能是不同类比RequestorResponse

我建议你这样做

public void getRequestor(Long requestorId, ResponseHandler<T> handler){ 
    String url = this.serviceUrl; 
    RestClient.url(url).get(null).onResponse(this.adapt(handler), RequestorResponse.class); 
} 

或者将此变更为

private <T> RestClient.ResponseHandler<T> adapt(ResponseHandler<?> handler){ 

这里提供一些参考:

  1. <T>泛型类型:https://docs.oracle.com/javase/tutorial/java/generics/types.html
  2. <?>通配符:https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
+0

为什么我的anwser被downvoted? –