"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 的任何东西。