如果功能接口扩展了另一个接口,它仍然是一个功能接口吗?

cod*_*eme 3 java functional-interface

Raoul-Gabriel Urma、Mario Fusco 和 Alan Mycroft 在《Java 8 in Action》一书中指出:

public interface Adder{
    int add(int a, int b);
}
public interface SmartAdder extends Adder{
    int add(double a, double b);
}
Run Code Online (Sandbox Code Playgroud)

SmartAdder 不是函数式接口,因为它指定了两个称为 add 的抽象方法(一个是从 Adder 继承的)。

在书中的另一个类似示例中,以下接口称为功能接口。

public interface ActionListener extends EventListener {
     void actionPerformed(ActionEvent e);
}
Run Code Online (Sandbox Code Playgroud)

与第二个示例相比,是什么让第一个示例不是功能接口?

Men*_*ena 5

因为SmartAdder提供了两个方法定义(即被add重载,不被覆盖):

  • int add(double a, double b);, 和
  • int add(int a, int b); (来自家长)

相反,EventListener是一个标记接口,所以ActionListener只提供一个方法定义,它自己的actionPerformed.


Era*_*ran 5

EventListener是一个空接口,因此ActionListener扩展它只有一个方法 - public void actionPerformed(ActionEvent e)。因此它是一个功能接口。

另一方面,SmartAdder有两个抽象方法(int add(int a, int b)int add(double a, double b)),所以它不能是一个函数式接口。