我已经定义了一个静态assertThat
方法来扩展AssertJ。此方法接受类型为
@FunctionalInterface
public interface Action {
void execute() throws Exception;
}
签名如下:
public static ExceptionAssert assertThat(Action action)
我想将此方法与静态导入一起使用。但它含糊不清。编译器不知道是否应该使用assertThat(Iterable)或我的方法。我不明白void
方法如何与返回Iterator<T>
的方法发生冲突。
知道如何解决这个冲突(不在assertThat
前面写类名)吗?
答案 0 :(得分:14)
您应该明确指定lambda的类型:
assertThat((Action)() -> {
...
});
另一个选项是使用其他名称,例如assertNoException
答案 1 :(得分:1)
我不明白
void
方法如何与返回Iterator<T>
的方法发生冲突。
你可以解决这种冲突的唯一方法是你的lambda表达式永远不会正常完成,例如: ()->{ throw new RuntimeException(); }
或()->{ for(;;); }
。
(或者如果你的lambda表达式由一个确实返回Iterable
的单个方法调用组成)
对于所有其他情况,你是对的,不应该有这样的冲突,实际上我可以编译等效代码而没有jdk1.8.0_20
的普通lambda表达式的任何问题(你没有包含触发的代码你问题中的错误。)
如果您遇到lambda表达式问题,该表达式可以正常完成并且使用了较旧的jdk,那么您遇到了here讨论的错误。 This answer指的是语言规范部分,它指定了void
- 兼容和与值兼容的lambda表达式之间的区别。
如果您使用其他编译器或IDE,例如Eclipse,确保您使用的是最新版本并提交错误报告,如果仍然出现此错误。
答案 2 :(得分:0)
我遇到了与eclipse版本4.4.1相同的问题 升级到4.4.2解决了它。
答案 3 :(得分:0)
我刚遇到同样的问题,并且brafdlog建议升级到更新版本的eclipse修复它。除了我的情况,我已经在4.4.2(Spring Tool Suite 3.6.4)上升级到最新的Eclipse Neon 4.6.1修复了它。