"The target type of this expression must be a functional interface" 尽管它是
"The target type of this expression must be a functional interface" even though it is
好吧,我在这里感觉很蠢。我 运行 今天在我的 Eclipse 中遇到了这个问题,对于这个世界我无法弄清楚问题是什么。
很简单。以下编译:
MockCreationListener l = (mock, settings) -> {};
Mockito.framework().addListener(l);
以下没有:
Mockito.framework().addListener((mock, settings) -> {});
我已经知道这是我忽略的一些愚蠢的事情,但这两位代码之间有什么区别?
我解决了。
后代的答案是 Mockito.framework().addListener() 需要一个 MockListener 接口,而不是 MockCreationListener。
为什么这很重要?因为 MockCreationListener 定义了由 lambda 实现的方法,并且 java 不知道 lambda 也是 MockListener 的有效实现——它没有方法。
我正在关闭它,并对浪费大家的时间表示歉意。
这是因为addListener
accepts a MockListener
界面。这是一个没有方法的标记接口。
如您所知,lambda 只能转换为具有一种抽象方法的接口。所以 Java 无法将您的 lambda 转换为 MockListener
。在没有任何其他信息的情况下,它不知道应该将您的 lambda 转换为什么功能接口,因此它会输出错误。
当然你知道应该是MockCreationListener
,但是编译器光看上下文是搞不出来的。就编译器而言,它可以是实现 MockListener
并且还接受两个参数和 returns void
的任何东西。
好吧,我在这里感觉很蠢。我 运行 今天在我的 Eclipse 中遇到了这个问题,对于这个世界我无法弄清楚问题是什么。
很简单。以下编译:
MockCreationListener l = (mock, settings) -> {};
Mockito.framework().addListener(l);
以下没有:
Mockito.framework().addListener((mock, settings) -> {});
我已经知道这是我忽略的一些愚蠢的事情,但这两位代码之间有什么区别?
我解决了。
后代的答案是 Mockito.framework().addListener() 需要一个 MockListener 接口,而不是 MockCreationListener。
为什么这很重要?因为 MockCreationListener 定义了由 lambda 实现的方法,并且 java 不知道 lambda 也是 MockListener 的有效实现——它没有方法。
我正在关闭它,并对浪费大家的时间表示歉意。
这是因为addListener
accepts a MockListener
界面。这是一个没有方法的标记接口。
如您所知,lambda 只能转换为具有一种抽象方法的接口。所以 Java 无法将您的 lambda 转换为 MockListener
。在没有任何其他信息的情况下,它不知道应该将您的 lambda 转换为什么功能接口,因此它会输出错误。
当然你知道应该是MockCreationListener
,但是编译器光看上下文是搞不出来的。就编译器而言,它可以是实现 MockListener
并且还接受两个参数和 returns void
的任何东西。