если функциональный интерфейс расширяет другой интерфейс, является ли он все еще функциональным интерфейсом? [дубликат]


На этот вопрос уже есть ответ здесь:

Java 8 в книге действий Рауля-Габриэля Урмы, Марио Фуско и Алана Майкрофта статистика, которая:

public interface Adder{
    int add(int a, int b);
}
public interface SmartAdder extends Adder{
    int add(double a, double b);
}

SmartAdder не является функциональным интерфейсом, потому что он определяет два абстрактные методы, называемые add (один наследуется от Сумматор).

В другом подобном примере в книге следующий интерфейс называется функциональным интерфейсом.

public interface ActionListener extends EventListener {
     void actionPerformed(ActionEvent e);
}

Что делает первый пример не функциональным интерфейсом по сравнению со вторым примером?

2 2

2 ответа:

Потому что SmartAdder предоставляет два определения метода (т. е. add перегружен, а не переопределен):

  • int add(double a, double b);, и
  • int add(int a, int b); (от родителя)

И наоборот, EventListener является интерфейсом маркера, поэтому ActionListener предоставляет только одно определение метода, свое собственное actionPerformed.

EventListener это пустой интерфейс, поэтому ActionListener, который расширяет его, имеет только один метод - public void actionPerformed(ActionEvent e). Поэтому это функциональный интерфейс.

С другой стороны, SmartAdder имеет два абстрактных метода (int add(int a, int b) и int add(double a, double b)), поэтому он не может быть функциональным интерфейсом.