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

Java中使用Lambda的不明确方法调用,java,lambda,java-8,assertj,Java,Lambda,Java 8,Assertj,我定义了一个静态的assertThat方法来扩展AssertJ。此方法接受以下类型的lambda表达式: @FunctionalInterface public interface Action { void execute() throws Exception; } 签名如下所示: public static ExceptionAssert assertThat(Action action) 我想将此方法用于静态导入。但这是模棱两可的。编译器不知道是否应该使用我的方法。我不明白void

我定义了一个静态的
assertThat
方法来扩展AssertJ。此方法接受以下类型的lambda表达式:

@FunctionalInterface
public interface Action {
  void execute() throws Exception;
}
签名如下所示:

public static ExceptionAssert assertThat(Action action)
我想将此方法用于静态导入。但这是模棱两可的。编译器不知道是否应该使用我的方法。我不明白
void
方法如何与返回
迭代器的方法冲突


您知道如何解决此冲突(无需在
assertThat
前面写入类名)吗?

您应该明确指定lambda的类型:

assertThat((Action)() -> {
    ...
});
另一个选项只是使用另一个名称,例如,
assertNoException

我不明白
void
方法如何与返回
迭代器的方法冲突

发生这种冲突的唯一方法是当lambda表达式从未正常完成时,例如
()->{throw new RuntimeException();}
()->{for(;;);}

(或者,如果lambda表达式由一个方法调用组成,该调用确实返回一个
Iterable

对于所有其他情况,您都是对的,不应该存在这样的冲突,事实上,我可以为普通lambda表达式编译与jdk1.8.0_20
等价的代码(您的问题中没有包含触发错误的代码)

如果您遇到了lambda表达式的问题,该表达式可以正常完成,并且使用了较旧的jdk,那么您就会遇到所讨论的错误。指指定
void
兼容和值兼容lambda表达式之间差异的语言规范部分


如果您使用了不同的编译器或IDE,例如Eclipse,请确保您使用的是最新版本,如果此错误仍然发生,请提交错误报告。

我在Eclipse 4.4.1版中遇到了相同的问题

升级到4.4.2解决了这个问题。

我刚刚遇到了同样的问题,正如brafdlog建议升级到较新版本的eclipse解决了这个问题。除了在我的例子中,我已经在4.4.2(Spring工具套件3.6.4)上,并升级到最新的Eclipse Neon 4.6.1。修复了它。

实际上,代码引发异常是个问题。