问题描述
好的,所以我在这里感觉很蠢。我今天在Eclipse中遇到了这个问题,对于整个世界,我都不知道是什么问题。
这很简单。编译如下:
MockCreationListener l = (mock,settings) -> {};
Mockito.framework().addListener(l);
以下内容不:
Mockito.framework().addListener((mock,settings) -> {});
我已经知道这是我忽略的一些愚蠢的事情,但是这两段代码有什么区别?
解决方法
这是因为addListener
接受MockListener
接口。这是一个没有方法的标记接口。
您可能知道,lambda只能使用一种抽象方法转换为接口。因此,Java无法将您的lambda转换为MockListener
。没有任何其他信息,它不知道将lambda转换为哪个功能接口,因此会输出错误。
当然,您知道它应该是MockCreationListener
,但是编译器无法仅通过查看上下文来弄清楚。就编译器而言,它可以是实现MockListener
并接受两个参数并返回void
的任何东西。
我解决了。
对于后代,答案是Mockito.framework()。addListener()需要MockListener接口,而不是MockCreationListener。
为什么那么重要?因为MockCreationListener定义了由lambda实现的方法,而java不知道lambda也是MockListener的有效实现-没有方法。
我正在关闭它,并出于浪费每个人的时间而采取策略。