JUnit的Arguments.of()为何不接受直接传入的Java Consumer Lambda实现?
编译失败原因及修复方案
失败原因
直接把(i)->Assert.assertNotNull(i)这个lambda作为参数传给Arguments.of()时,Java编译器无法自动推断该lambda对应的函数式接口类型。因为Arguments.of()是泛型可变参数方法,参数类型为Object...,编译器没有足够上下文判断这个lambda应该被解析为Consumer<Instant>,还是其他兼容的单参数函数式接口。而第一个可编译代码先将lambda赋值给显式声明为Consumer<Instant>的变量,编译器已经明确了类型,再传入Arguments.of()就不会有问题。
修复方案
以下几种方式均可解决编译问题:
1. 显式转换lambda类型
直接把lambda强制转换为Consumer<Instant>,明确告知编译器类型:
public static Stream argumentProvider() { return Stream.of( Arguments.of("2024-11-06 00:00:00",13,-2, (Consumer<Instant>) (i)-> Assert.assertNotNull(i)) ); }
2. 指定Arguments.of()的泛型参数
通过泛型参数明确所有传入参数的类型,让编译器正确推断lambda的类型:
public static Stream argumentProvider() { return Stream.of( Arguments.<String, Integer, Integer, Consumer<Instant>>of("2024-11-06 00:00:00",13,-2, (i)-> Assert.assertNotNull(i)) ); }
3. 提前赋值给显式类型变量
和第一个可编译代码逻辑一致,先把lambda赋值给声明为Consumer<Instant>的变量,再传入方法:
public static Stream argumentProvider() { Consumer<Instant> consumer = (i)-> Assert.assertNotNull(i); return Stream.of( Arguments.of("2024-11-06 00:00:00",13,-2, consumer) ); }
内容的提问来源于stack exchange,提问作者curiousengineer
相关产品推荐
相关产品推荐

