即使此表达式的目标类型必须是功能接口

问题描述

好的,所以我在这里感觉很蠢。我今天在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的有效实现-没有方法。

我正在关闭它,并出于浪费每个人的时间而采取策略。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...