为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Java 8 和 Java 11 时如何修复

使用 Java 8 和 Java 11 时如何修复

白猪掌柜的 2023-07-19 15:04:00
我正在使用使用 Java 11 构建的微服务,该服务具有在 Java 8 中构建的依赖项。依赖项中有休息客户端,并且有一个方法可以执行此操作:    public <T> ResponseEntity<my.company.Wrapper<T>> getForList(String url, HttpHeaders headers) {        try {            return template.exchange(url, GET, new HttpEntity<>(headers), new ParameterizedTypeReference<Wrapper<T>>() { });        } catch (RestClientException restEx) {            logger.error("RestClientException!, restEx: {}", restEx);            throw restEx;        }    }休息通话刚刚成功, response -> <200,Wrapper [ elements = [{id=dbfc2557-1738-45e4-8ecd-235d35158957, .....然后,在微服务(使用 Java 11)中,有一个点需要使用 java Stream:        var found = enttsResponse.stream()                .map(MyCompanyResponse::getId)                .collect( toList() );异常消息是:java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.mycompany.commons.v2.entitlement.MyCompanyResponse (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.mycompany.commons.v2.entitlement.MyCompanyResponse is in unnamed module of loader 'app')我熟悉Java8,但不熟悉Java 11,我认为与类加载器有关(来自Java 9)解决方法已接受,提前致谢!
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您有一个 形式的类型标记new ParameterizedTypeReference<Wrapper<T>>() { },引用类型变量。由于类型擦除(这种类型标记首先存在的原因),这不起作用。

接收类型令牌的框架只会知道它必须生成一个Wrapper,但仍然不知道是什么T。所以它不知道要生成什么并且会回退到集合(即LinkedHashMap)。

您必须用引用已知可具体化类型的表达式替换泛型方法的调用,即

template.exchange(uriBuilder.toUriString(), GET, new HttpEntity<>(headers),
    new ParameterizedTypeReference<Wrapper<EntitlementResponse>>() { })


查看完整回答
反对 回复 2023-07-19
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信