если функциональный интерфейс расширяет другой интерфейс, является ли он все еще функциональным интерфейсом? [дубликат]
На этот вопрос уже есть ответ здесь:
- концепция функционального интерфейса 4 ответа
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 ответа:
Потому что
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)), поэтому он не может быть функциональным интерфейсом.