欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

IDEA/MAVEN编译错误:不兼容的类型,推断类型不符合上限,这就是我们熟知的泛型

来源: javaer 分享于  点击 45582 次 点评:239

IDEA/MAVEN编译错误:不兼容的类型,推断类型不符合上限,这就是我们熟知的泛型


IDEA在build项目或用maven构建时,出现错误→不兼容的类型: 推断类型不符合上限

Error:(285, 67) java: 不兼容的类型: 推断类型不符合上限
    推断: java.util.Map<? extends java.lang.Object,? extends java.lang.Object>
    上限: java.util.Map<java.lang.String,com.emax.channel.OrderDTO>,java.lang.Object

对应的代码如下

 1 Map<String, OrderDTO> executeResult = transactionTemplate.execute(transactionStatus -> {
 2     boolean commonSaveResult;
 3     // ......logic code here......
 4     commonSaveResult = orderManager.save(order);
 5     if (!commonSaveResult) {
 6         log.warn("结算单号:{}结算主单落库失败,触发事务回滚", order.getTransferNo());
 7         transactionStatus.setRollbackOnly();
 8         return new HashMap<>();
 9     }
10 
11     Map<String, OrderDTO> map = new HashMap<>();
12     // ......logic code here......
13     return map;
14 });

 

原因分析

我们点击错误消息时会标记第1行代码,但其实原因是第8行返回的 new HashMap<>()。这就是我们熟知的泛型类型推导问题。我们知道,Map<K,V> / HashMap<K,V>是java.util包里的泛型类,new HashMap<>等价于new HashMap<Object, Object>, 而外层接收的是 Map<String, OrderDTO>。 出现类型不一致,jre又无法推断出来,所以就报错了。

 

解决办法有二

办法一:既然IDE(JRE)推断不出来,那我们就明确泛型的类型。即:将上面第8行代码改为 return new HashMap<String, OrderDTO>();

办法二:升级jdk版本。上面的build报错,我的项目JDK版本是1.8.0_40。升级到1.8.0_241后,这个问题就没有了, 高版本的JRE已经可以推断出来这个类型转换了。

 

  

 

  

 


当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/p/17161926.html


相关栏目:

用户点评