【问题标题】:How Comparator Interface in Java 8 become a @FunctionalInterface [duplicate]Java 8 中的比较器接口如何成为@FunctionalInterface [重复]
【发布时间】:2023-04-04 17:26:01
【问题描述】:

我想澄清一下我对@FunctionalInterface 的理解。 据我所知,我们可以在只有一个抽象方法的接口上添加@FunctionalInterface注解(虽然它可以有多个默认和静态方法。

在 Java 8 中,Comparator<T> 接口已被标记为 @FunctionalInterface,因此它可以在 Lambda 表达式中使用,但是当我打开定义时,我可以看到那里有 2 个抽象类

int compare(T o1, T o2); 和 boolean equals(Object obj);

我想了解如何在功能接口中拥有超过 2 个抽象方法并且仍然没有出现任何错误?帮助我澄清我对此的理解。

【问题讨论】:

    标签: java java-8


    【解决方案1】:

    boolean equals(Object obj) 已经在java.lang.Object 上定义,因此它并不是接口中真正的“新”方法。它只是在这里“重复”,因为实现合同——它是 Javadoc 的一部分,但不由编译器强制执行——正在变得更加严格(它必须与 compare 一致)。

    【讨论】:

      【解决方案2】:

      @FunctionalInterface 注释的Java docs 中回答了您的问题:

      如果一个接口声明了一个抽象方法,它覆盖了其中一个 java.lang.Object 的公共方法,这也不计入 接口的抽象方法计数,因为任何实现 接口将具有来自 java.lang.Object 或的实现 其他地方。

      因此,在 Comparator 接口中存在 boolean equals(Object obj); 并不会增加接口中存在的抽象方法的数量,因此我们可以将 @FunctionalInterface 应用于此接口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 2019-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-03
        相关资源
        最近更新 更多