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