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

最近我开始探索Java 8,我不能完全理解“功能接口”的概念,这对Java实现lambda表达式至关重要。Java中有一个非常全面的lambda函数指南,但我被困在了定义函数接口概念的章节上。定义如下:

更准确地说,功能接口被定义为任何只有一个抽象方法的接口。

然后,他继续举一些例子,其中一个是接口:Comparator

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

我能够测试我可以使用lambda函数代替比较器参数,并且它有效(即)。Collections.sort(list, (a, b) -> a-b)

但是在比较器接口中,方法和方法都是抽象的,这意味着它有两个抽象的方法。那么,如果定义要求接口只有一个抽象方法,这怎么能工作呢?我在这里错过了什么?compareequals


答案 1

您链接到的同一页面

接口比较器是有效的,因为尽管它声明了两个抽象方法,但其中一个 (等于) 具有与 Object 中的公共方法相对应的签名。接口总是声明与 Object 的公共方法相对应的抽象方法,但它们通常是隐式的。无论是隐式声明还是显式声明,此类方法都将从计数中排除。

我真的不能说得更好。


答案 2

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

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

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

例如:

  • 这有效

    @FunctionalInterface
    public interface FunctionalInterf {
    
        void m();
    
        boolean equals(Object o);
    
    }
    
  • 这将生成一个错误:

    @FunctionalInterface
    public interface FunctionalInterf {
    
        void m();
    
        boolean equals();
    
    }
    

    在接口 FunctionalInterf 中找到多个非重写抽象方法


推荐