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