用Java中的Lambda调用不明确的方法

时间:2014-09-15 14:33:27

标签: java lambda java-8 assertj

我已经定义了一个静态assertThat方法来扩展AssertJ。此方法接受类型为

的lambda表达式
@FunctionalInterface
public interface Action {
  void execute() throws Exception;
}

签名如下:

public static ExceptionAssert assertThat(Action action)

我想将此方法与静态导入一起使用。但它含糊不清。编译器不知道是否应该使用assertThat(Iterable)或我的方法。我不明白void方法如何与返回Iterator<T>的方法发生冲突。

知道如何解决这个冲突(不在assertThat前面写类名)吗?

4 个答案:

答案 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修复了它。