Java “此表达式的目标类型必须是函数接口”,即使是

Java “此表达式的目标类型必须是函数接口”,即使是,java,functional-interface,Java,Functional Interface,好吧,我在这里感觉很傻。我在今天的日食中遇到了这个问题,我实在搞不清楚这个问题是什么 这很简单。汇编如下: MockCreationListener l = (mock, settings) -> {}; Mockito.framework().addListener(l); 以下情况不适用: Mockito.framework().addListener((mock, settings) -> {}); 我已经知道这是我忽略的一些愚蠢的事情,但是这两个代码之间的区别是什么?我解

好吧,我在这里感觉很傻。我在今天的日食中遇到了这个问题,我实在搞不清楚这个问题是什么

这很简单。汇编如下:

MockCreationListener l = (mock, settings) -> {};
Mockito.framework().addListener(l);
以下情况不适用:

Mockito.framework().addListener((mock, settings) -> {});
我已经知道这是我忽略的一些愚蠢的事情,但是这两个代码之间的区别是什么?

我解决了它

对于后代来说,答案是Mockito.framework.addListener需要一个MockListener接口,而不是MockCreationListener

为什么这很重要?因为MockCreationListener定义了由lambda实现的方法,java不知道lambda也是MockListener的有效实现,因为MockListener没有方法

我要结束它,并为浪费大家的时间而道歉。

我解决了它

对于后代来说,答案是Mockito.framework.addListener需要一个MockListener接口,而不是MockCreationListener

为什么这很重要?因为MockCreationListener定义了由lambda实现的方法,java不知道lambda也是MockListener的有效实现,因为MockListener没有方法

我正在关闭它,并为浪费每个人的时间而道歉。

这是因为我接受一个接口。这是一个没有方法的标记接口

您可能知道,lambda只能转换为只有一个抽象方法的接口。因此Java无法将lambda转换为MockListener。在没有任何其他信息的情况下,它不知道应该将lambda转换为哪个函数接口,因此会输出一个错误

当然,您知道它应该是MockCreationListener,但是编译器不能仅仅通过查看上下文来理解它。就编译器而言,它可以是实现MockListener的任何东西,也可以接受两个参数并返回void。

这是因为它接受一个接口。这是一个没有方法的标记接口

您可能知道,lambda只能转换为只有一个抽象方法的接口。因此Java无法将lambda转换为MockListener。在没有任何其他信息的情况下,它不知道应该将lambda转换为哪个函数接口,因此会输出一个错误


当然,您知道它应该是MockCreationListener,但是编译器不能仅仅通过查看上下文来理解它。就编译器而言,它可以是实现MockListener的任何东西,也可以接受两个参数并返回void。

只要不删除它。如果它对其他人也有帮助,那也不是浪费时间。只要你不删除它。如果对其他人也有帮助,那也不是浪费时间。我接受你的答案,因为你的措辞比我自己的更清楚:-我接受你的答案,因为你的措辞比我自己的更清楚:-