Java 8中"功能接口"的精确定义

Ant*_*hyn 66 lambda abstract java-8 functional-interface

最近我开始探索Java 8,我无法理解Java功能实现lambda表达式所必需的"功能接口"的概念.有一个非常全面的 Java函数中的lambda函数指南,但我仍然坚持用于定义函数接口概念的章节.定义如下:

更确切地说,功能接口被定义为具有恰好一个抽象方法的任何接口.

然后他进入示例,其中一个是Comparator界面:

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
} 
Run Code Online (Sandbox Code Playgroud)

我能够测试我可以使用lambda函数代替Comparator参数,它可以工作(即Collections.sort(list, (a, b) -> a-b)).

但是在Comparator接口中,两者compareequals方法都是抽象的,这意味着它有两个抽象方法.那么如果定义要求接口只有一个抽象方法,那么它如何工作呢?我在这里错过了什么?

Mar*_*ers 59

您链接到同一页面:

接口Comparator是有用的,因为虽然它声明了两个抽象方法,但其中一个 - equals-具有与Object中的公共方法相对应的签名.接口总是声明与Object的公共方法相对应的抽象方法,但它们通常是隐式的.无论是隐式声明还是显式声明,此类方法都会从计数中排除.

我真的不能说得更好.

编辑:根据莫里斯的评论更新到本页面的最新文本(谢谢!)

  • 不过,我可以说它好一点,因为那不是_exactly_正确.JLS中的一个子句说接口必须声明对应于`Object`的公共方法的抽象方法.如果他们没有明确地这样做,那么他们将获得隐式声明(通常的情况).但是这些方法虽然是抽象的,但在决定接口是否具有"单一"抽象方法时并不重要.无论是隐式声明还是显式声明都是如此.您现在引用的FAQ页面准确地说明了这种情况. (16认同)
  • 啊,你绝对正确。我不知道为什么我没有注意到,阅读时我会更加专心。 (2认同)

ROM*_*eer 9

@FunctionalInterface页面给出了另一种解释:

从概念上讲,功能界面只有一种抽象方法.由于默认方法具有实现,因此它们不是抽象的.如果接口声明覆盖其中一个公共方法的抽象方法java.lang.Object,那么也不会计入接口的抽象方法计数,因为接口的任何实现都将具有来自java.lang.Object其他地方的实现.

您可以测试它的接口是一个正确的功能接口使用 @FunctionalInterface.

例如: