【问题标题】:"The target type of this expression must be a functional interface" even though it is“此表达式的目标类型必须是函数式接口”,即使它是
【发布时间】:2020-08-21 08:25:07
【问题描述】:

好的,所以我在这里感觉很愚蠢。我今天在我的 Eclipse 中遇到了这个问题,对于这个世界,我无法弄清楚问题是什么。

这很简单。以下编译:

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

以下不是:

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

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

【问题讨论】:

    标签: java functional-interface


    【解决方案1】:

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

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

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

    【讨论】:

    • 我接受你的回答,因为你的措辞比我自己的要清楚得多:-)
    【解决方案2】:

    好吧,我解决了。

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

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

    我要关闭它并为浪费大家的时间道歉。

    【讨论】:

    • 只要不删除即可。如果它也能帮助别人,那也不是浪费时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多