Sobes.tech
Назад к вопросам
Junior — Middle
48

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

Ответ от нейросети

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 не создаёт ограничение, а лишь проверяет его на этапе компиляции.
  • Два абстрактных метода означают, что интерфейс уже не функциональный.