[英]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.