我们知道,Map
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