英文:
"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) -> {});
我已经知道这是我忽视的一些愚蠢问题,但这两段代码之间有什么区别呢?
英文:
Okay so I'm feeling pretty dumb here. I ran into this problem in my Eclipse today and for the world I can't figure out what the problem is.
It's very simple. The following compiles:
MockCreationListener l = (mock, settings) -> {};
Mockito.framework().addListener(l);
The following does not:
Mockito.framework().addListener((mock, settings) -> {});
I know already that this is some silly thing I overlooked but what is the difference between these two bits of code?
答案1
得分: 2
这是因为 addListener
接受一个 MockListener
接口。该接口是一个没有方法的标记接口。
正如您所知,Lambda 表达式只能转换为具有恰好一个抽象方法的接口。因此,Java 无法将您的 Lambda 表达式转换为 MockListener
。在没有其他信息的情况下,它不知道应该将您的 Lambda 表达式转换为哪个功能接口,因此会输出错误。
当然,您 知道它应该是 MockCreationListener
,但编译器不能仅仅通过查看上下文来弄清楚这一点。就编译器而言,它可以是实现了 MockListener
、同时接受两个参数并返回 void
的任何内容。
英文:
This is because addListener
accepts a MockListener
interface. which is a marker interface with no methods.
As you may know, lambdas can only be converted to interfaces with exactly one abstract method. So Java can't convert your lambda to MockListener
. Without any other information, it doesn't know what functional interface it should convert your lambda to, so it outputs an error.
Of course, you know that it should be MockCreationListener
, but the compiler can't figure it out just by looking at the context. It could be anything that implements MockListener
and also accepts two parameters and returns void
, as far as the compiler is concerned.
答案2
得分: 1
好的,以下是翻译好的内容:
我解决了它。
为了后人,答案是 Mockito.framework().addListener() 期望一个 MockListener 接口,而不是一个 MockCreationListener。
为什么这很重要?因为 MockCreationListener 定义了 lambda 实现的方法,而 Java 并不知道该 lambda 也是 MockListener 的有效实现——后者没有任何方法。
我正在关闭它,并为浪费大家的时间道歉。
英文:
Well I solved it.
For posterity the answer is that Mockito.framework().addListener() expects a MockListener interface, not a MockCreationListener.
Why is that important? Because MockCreationListener defines the method being implemented by the lambda and java has no idea that the lambda is also a valid implementation of MockListener - which has no methods.
I'm closing it and apoligies for wasting everyone's time.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论