【问题标题】:Incompatible types with T与 T 不兼容的类型
【发布时间】: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&lt;RequestorResponse&gt;?我猜你必须以某种方式暗示,例如铸造空值:....get((RequestorResponse) null).
  • 请显示RestClient.url(whatever that type is).get方法的定义。

标签: java generics


【解决方案1】:

似乎您正在尝试将定义的 Class RequestorResponse 传递给泛型类型 this.adapt(handler)

ResponseHandler 处理程序

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

或者把this.adapt改成

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

这里有一些参考:

  1. &lt;T&gt; 通用类型:https://docs.oracle.com/javase/tutorial/java/generics/types.html
  2. &lt;?&gt; 通配符:https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 2019-02-08
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多