使用HashMap的computeIfAbsent报错‘无法推断函数式接口类型’排查
问题原因及解决办法
核心原因
这是Java类型推断机制的局限性导致的:
put方法接收的参数类型是明确的List<Tuple<ShipmentDTO, ShipmentItemDTO>>,编译器可以直接根据itemMap的泛型定义,自动推断new ArrayList<>()的泛型为Tuple<ShipmentDTO, ShipmentItemDTO>,所以能正常编译。computeIfAbsent的第二个参数是Function<? super K, ? extends V>类型的lambda表达式,编译器无法从无参数lambda的上下文里自动推断出new ArrayList<>()应该持有的泛型类型,因此抛出“无法推断函数式接口类型”的错误。
解决办法
有两种简单的修复方式:
- 显式指定ArrayList的泛型类型
itemMap.computeIfAbsent("id", () -> new ArrayList<Tuple<ShipmentDTO, ShipmentItemDTO>>());
- 使用方法引用替代lambda
方法引用的类型推断能力更强,编译器能通过itemMap的泛型定义自动匹配正确的构造方法:
itemMap.computeIfAbsent("id", ArrayList::new);
内容的提问来源于stack exchange,提问作者bikeman868
相关产品推荐
相关产品推荐

