Возможна ли реализация функционального интерфейса с двумя абстрактными методами?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Функциональный интерфейс в Java по определению должен иметь ровно один абстрактный метод. Два абстрактных метода в таком интерфейсе невозможны, если только один из них не унаследован как default, static или Object-метод, который не считается абстрактным. Это важно, потому что именно один абстрактный метод позволяет использовать лямбда-выражения и method reference.
Определение:
Функциональный интерфейс — это интерфейс с одним абстрактным методом. В Java он обычно помечается аннотацией @FunctionalInterface, которая помогает компилятору проверить это ограничение. Если в интерфейсе два действительно абстрактных метода, он перестаёт быть функциональным и не может использоваться как цель для лямбды.
Пример использования:
@FunctionalInterface
interface Calculator {
int apply(int a, int b);
default void log() {
System.out.println("Calculating...");
}
}
// Использование
Calculator sum = (a, b) -> a + b;
System.out.println(sum.apply(2, 3)); // 5
Если добавить второй абстрактный метод, например int subtract(int a, int b);, компилятор выдаст ошибку, потому что интерфейс больше не соответствует требованиям функционального интерфейса.
Пояснение кода:
В примере apply(int a, int b) — единственный абстрактный метод, поэтому интерфейс подходит для лямбды (a, b) -> a + b. Метод log() не мешает, потому что он default и уже имеет реализацию. Если бы был добавлен ещё один абстрактный метод, компилятор не смог бы однозначно сопоставить лямбда-выражение с интерфейсом.
Ключевые моменты:
- Функциональный интерфейс в Java может иметь только один абстрактный метод.
defaultиstaticметоды не считаются абстрактными.- Методы
ObjectвродеtoString()не ломают функциональность интерфейса. @FunctionalInterfaceне создаёт ограничение, а лишь проверяет его на этапе компиляции.- Два абстрактных метода означают, что интерфейс уже не функциональный.