java—“这个表达式的目标类型必须是函数接口”,尽管它是

332nm8kg  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(288)

好吧,所以我觉得自己很笨。我在今天的Eclipse中遇到了这个问题,但我不知道这个问题是什么。
很简单。以下汇编:

MockCreationListener l = (mock, settings) -> {};
Mockito.framework().addListener(l);

以下不适用:

Mockito.framework().addListener((mock, settings) -> {});

我已经知道,这是一些愚蠢的事情,我忽略了,但这两位代码之间的区别是什么?

o2rvlv0m

o2rvlv0m1#

我解决了。
对于后代来说,答案是mockito.framework().addlistener()需要一个mocklistener接口,而不是mockcreationlistener。
为什么这很重要?因为mockcreationlistener定义了lambda实现的方法,而java不知道lambda也是mocklistener的有效实现,因为mocklistener没有方法。
我要关门了,为浪费大家的时间道歉。

68bkxrlz

68bkxrlz2#

这是因为 addListener 接受 MockListener 接口。它是一个没有方法的标记接口。
如您所知,lambda只能转换为只有一个抽象方法的接口。所以java无法将lambda转换为 MockListener . 如果没有任何其他信息,它就不知道应该将lambda转换为什么函数接口,因此它会输出一个错误。
当然,你知道应该 MockCreationListener ,但是编译器不能仅仅通过查看上下文来理解它。可能是任何 MockListener 并接受两个参数和返回值 void ,就编译器而言。

相关问题