如何确定接口在 Java 中是否有效?

Dim*_*San 5 java lambda java-8

众所周知,Java 8 向 Java 开发人员引入了函数式编程。

ComparatorRunnableCallable等接口是功能性的。

从定义如下:功能接口是只有一个抽象方法的接口

但是例如同一个接口Comparator有多个抽象方法:

int compare(T o1, T o2);

boolean equals(Object obj); // inherited from Object class

// and a lot of concrete methods more
Run Code Online (Sandbox Code Playgroud)

那么,是否有任何严格的规则来确定接口是否是函数式的,以便它可以用作 lambda 表达式或方法引用的赋值目标?

Mar*_*olt 6

来自JLS §9.8(突出显示我的):

函数式接口是只有一个抽象方法的接口(除了 Object 的方法

理由是

  1. 使用该接口,您必须实例化它。每个实例化都必然继承自Object,因此无论如何都实现了这些抽象方法。

    另一种方法 - boolean equals(Object)- 是抽象方法的显式声明,否则该方法将被隐式声明,并且将由实现该接口的每个类自动实现。

  2. 作为函数式接口,您不太可能想要调用由Object. 因此,这些方法在搜索要调用的方法时不计算在内(因为函数接口的方法可以在命名该方法的情况下调用)。

    这是为了允许对接口进行功能处理,例如java.util.Comparator<T>声明多个抽象方法,其中只有一个是真正“新的” - int compare(T,T)

  • 是的,在确定接口是否正常工作时,会忽略非抽象方法。 (2认同)