【问题标题】:Class<T> not accepting ParameterizedTypeReferenceClass<T> 不接受 ParameterizedTypeReference
【发布时间】:2019-12-27 06:49:56
【问题描述】:

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

父类中的方法:

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

【问题讨论】:

  • 简单地说,ParameterizedTypeReference 不是Class。你打算通过什么Class?是List&lt;MyOtherClass&gt;吗?如果是这样,为什么不直接通过呢?

标签: java spring jakarta-ee


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先,方法签名说Classjava.lang.Class 一样,所以你应该使用typeRef.getClass() 来传递typeRef 类的实例而不是ParametrizedClassReference 的实例。

    但那是行不通的。

    makeRequest 应该返回ResponseEntity&lt;T&gt;T 究竟是什么,Java 编译器会根据方法参数来推断。如果您将最后一个参数更改为typeRef.getClass(),那么Java 将期望方法返回ResponseEntity&lt;ParametrizedClassReference&lt;List&lt;MyOtherClass&gt;&gt;

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

    您可能希望创建makeRequest 的重载版本以同时接受ParameterizedTypeReference

    【讨论】:

    • 我之前创建了重载方法,但是makeRequest()两个版本的逻辑是一样的。唯一的区别是最后一个参数。因此,我正在寻找更好的解决方案。
    【解决方案3】:

    来自方法定义:-

    public <T> ResponseEntity<T> makeRequest(HttpMethod method, String endpoint, HttpEntity<?> request, Class<T> responseType);
    

    编译器需要泛型类型Class&lt;T&gt; 作为参数。但是您尝试使用不同的泛型类型 ParametrizedClassReference&lt;T&gt; 作为参数。因此它不会编译。

    我假设在内部 makeRequest 方法调用 RestTemplate#exchange 方法之一。将 ParametrizedClassReference&lt;T&gt; 的参数类型更改为 Class&lt;T&gt; 以使编译工作。例如:-

    Class<? extends List> classes = (new ArrayList<MyOtherClass>()).getClass();
    ResponseEntity<List<MyOtherClass>> response = makeRequest(HttpMethod.GET,uriComponents.toUriString(), request, classes);
    

    【讨论】:

    • 实际上发出这个请求的方法是getOtherClass,它返回一个List。我需要提出此请求以获取 List.
    • 明白。 @Faiyet 也许 (new ArrayList()).getClass() 语句会做。我已经更新了我上面的例子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多