【问题标题】:Why not multiple abstract methods in Functional Interface in Java8? [duplicate]为什么不在 Java 8 的功能接口中使用多个抽象方法? [复制]
【发布时间】:2017-08-02 16:31:17
【问题描述】:
@FunctionalInterface
interface MyLambda {
    void apply1();
    int apply2(int x, int y);
}

现在使用 Lambda 表达式,为什么 Java 不能允许以下两个,因为它清楚地区分了两者:

MyLambda ml1 = () -> System.out.println("Hello");
MyLambda ml2 = (x, y) -> x+y;

【问题讨论】:

  • 您不能这样做没有技术原因。不过,它看起来不会那样。语法可能很糟糕,可能会损害单一方法 lambda。它也不是特别有用。添加的方法越多,编写适当的实现类就越有说服力。
  • 打电话给ml1.apply2(x, y)会发生什么?
  • 感谢大家的cmets。我想我得到了答案,将发布答案

标签: java lambda


【解决方案1】:

答案是,为了创建一个有效的实现,您需要能够一次传递 N 个 lambda,这会带来很多歧义并大大降低可读性。

另外,@FunctionalInterface 用于表示一个接口,可以用作 lambda 表达式的目标,而 lambda 是一个 SINGLE 函数。

无论如何,您的示例无效并且无法编译,因为它试图在功能接口上创建两个不完整的实现。

【讨论】:

  • 感谢您的回答,这仅仅是因为可读性。我们有重载的概念,我们可以对 Lambdas 或抽象方法进行重载,这就是我的想法!
  • @sairam 你在一个接口中放置的方法越多,如果可能的话,你会得到越多的歧义——我们已经有了一个很好的工具来做到这一点——经典的接口实现:)
  • 这是有道理的。但请检查我的回答为什么必须只有一种方法:) 感谢您的帮助
【解决方案2】:

写Lamba表达式意味着我们正在实现的接口是函数式接口。它应该有一个抽象方法,因为在 lambda 表达式时,我们一次只能提供一个实现。 因此,在问题中发布的代码 sn-p 中,任何时候我们都只给出一个实现,同时声明 Lambda,我们必须在其中实现两个抽象方法。

感谢您的帮助。

【讨论】:

    【解决方案3】:

    函数式接口是只有一个抽象的接口 方法(除了 Object 的方法),因此表示一个 单一功能合约。这种“单一”的方法可以采取以下形式 具有重写等效签名的多个抽象方法 从超接口继承;在这种情况下,继承的方法 逻辑上表示单个方法。

    https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.8

    【讨论】:

    • 这回答了“什么是函数式接口”,而不是“为什么函数式接口不能包含多个抽象方法”。
    • 感谢您的回答,了解它遵循单一功能合同,但为什么呢?
    • 只有一个函数的原因是 - Java 希望提供函数式编程的能力,就像在 JavaScript 中函数也是对象并且可以作为参数传递。为了提供该功能,他们包含了@FunctionalInterface,因此该类中只有一个函数。当您将类作为参数传递时, viola !您正在传递 JavaScript 中的功能。
    猜你喜欢
    • 2013-11-25
    • 2019-03-02
    • 2014-06-14
    • 2017-08-17
    • 2016-08-21
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多