【问题标题】:FunctionalInterface Comparator has 2 abstract methodsFunctionalInterface Comparator 有 2 个抽象方法
【发布时间】:2018-05-26 22:25:08
【问题描述】:

学习 Java 8 Lambda 并想知道编译器如何知道 Comparator 中的哪个方法用于 lambda 表达式? 好像不是SAM接口?它有 2 个抽象方法:

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

【问题讨论】:

    标签: java lambda java-8 functional-interface


    【解决方案1】:

    equals() 不是抽象方法。此方法覆盖Object.equals(Object),并且只有 Comparator 接口能够将 javadoc 附加到该方法,解释比较器应如何实现 equals()

    javadoc of FunctionalInterface

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

    【讨论】:

    • 很遗憾equals 不是真正的抽象方法时会列在“抽象方法”选项卡下。
    • 您是说equals 方法被覆盖,但接口或功能接口不是 Object 类的子类。你能帮我理解一下吗?
    【解决方案2】:

    equals() 继承自 Object,在判断接口是否为函数式接口时,不计算继承的公共方法。所以即使 equals() 在 Comparator 中是抽象的,因为它是继承的,所以它不算数。

    规则: 功能接口 是具有一个抽象方法的接口。默认方法不算; 静态方法不算;并且从 Object 继承的方法不算数。

    【讨论】:

      【解决方案3】:

      所有类都继承自 Object 类,并且 Object 包含一个 equal 方法。
      因此,这意味着实现 Comparator 的每个实例都已经实现了 equal 方法。

      因此,Comparator Interface 的 Implanting 类只需要覆盖一个方法。
      这使得 Comparator 接口中只有一个抽象方法

      这是why Comparator is a functional interface

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-22
        • 1970-01-01
        • 2017-04-10
        • 2011-07-10
        • 1970-01-01
        • 2014-10-30
        相关资源
        最近更新 更多