繁体   English   中英

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

[英]Ambiguous method call with Lambda in Java

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

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

签名如下所示:

public static ExceptionAssert assertThat(Action action)

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

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

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

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

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

我不明白void方法如何与返回Iterator<T>的方法冲突。

你的lambda表达式永远不会正常完成,例如()->{ throw new RuntimeException(); } ()->{ throw new RuntimeException(); }()->{ for(;;); } ()->{ for(;;); }

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM