Как аннотация @FunctionalInterface влияет на компиляцию в Java?

«Как аннотация @FunctionalInterface влияет на компиляцию в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Аннотация @FunctionalInterface не влияет на логику компиляции или выполнение кода, но является строгой инструкцией для компилятора.

Её цель — выполнить проверку на этапе компиляции, что интерфейс соответствует требованиям функционального интерфейса (имеет ровно один абстрактный метод). Если это условие нарушено, компилятор выдаст ошибку.

Пример:

@FunctionalInterface
interface Adder {
    int add(int a, int b); // Единственный абстрактный метод
    // int subtract(int a, int b); // Раскомментирование вызовет ошибку компиляции

    // Допустимо: методы по умолчанию и статические методы не нарушают правило
    default void log() { System.out.println("Adding"); }
}

Почему это важно:

  • Защита от ошибок: Предотвращает случайное добавление второго абстрактного метода, которое сломает все лямбда-выражения, использующие этот интерфейс.
  • Явное указание намерений: Чётко сообщает другим разработчикам, что интерфейс предназначен для использования с лямбда-выражениями или ссылками на методы.

Без аннотации интерфейс может быть функциональным «де-факто», но лишается этой защитной проверки компилятора.