buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

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已经可以推断出来这个类型转换了。

 

  

 

  

 

posted on 2023-02-28 10:28  buguge  阅读(3436)  评论(0编辑  收藏  举报