9

I have defined a static assertThat method to extend AssertJ. This method accepts a lambda expression of the type:

@FunctionalInterface
public interface Action {
  void execute() throws Exception;
}

The signature looks like this:

public static ExceptionAssert assertThat(Action action)

I want to use this method with a static import. But it is ambiguous. The compiler doesn't know whether assertThat(Iterable) or my method should be used. I don't understand how a void method can conflict with a method that returns an Iterator<T>.

Any idea how to resolve this conflict (without writing the class name in front of assertThat)?

4

4 回答 4

17

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

assertThat((Action)() -> {
    ...
});

另一个选项只是使用其他名称,例如,assertNoException

于 2014-09-16T08:26:44.310 回答
1

我不明白一个void方法如何与返回一个Iterator<T>.

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

(或者如果您的 lambda 表达式包含一个确实返回的方法调用Iterable

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

如果您遇到了可以正常完成的 lambda 表达式的问题并且使用了较旧的 jdk,那么您遇到了此处讨论的错误。这个答案是指语言规范部分,它指定了void-compatible 和 value-compatible lambda 表达式之间的区别。

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

于 2014-09-17T16:27:56.640 回答
0

我在 Eclipse 版本 4.4.1 上遇到了同样的问题,
升级到 4.4.2 解决了它。

于 2015-08-02T11:00:29.693 回答
0

我刚刚遇到了同样的问题,正如 brafdlog 建议升级到更新版本的 eclipse 修复了它。除了在我的情况下,我已经使用 4.4.2(Spring Tool Suite 3.6.4)并升级到最新的 Eclipse Neon 4.6.1 修复了它。

于 2016-11-30T15:04:03.457 回答