Ответ
Аннотация @FunctionalInterface не влияет на логику компиляции или выполнение кода, но является строгой инструкцией для компилятора.
Её цель — выполнить проверку на этапе компиляции, что интерфейс соответствует требованиям функционального интерфейса (имеет ровно один абстрактный метод). Если это условие нарушено, компилятор выдаст ошибку.
Пример:
@FunctionalInterface
interface Adder {
int add(int a, int b); // Единственный абстрактный метод
// int subtract(int a, int b); // Раскомментирование вызовет ошибку компиляции
// Допустимо: методы по умолчанию и статические методы не нарушают правило
default void log() { System.out.println("Adding"); }
}
Почему это важно:
- Защита от ошибок: Предотвращает случайное добавление второго абстрактного метода, которое сломает все лямбда-выражения, использующие этот интерфейс.
- Явное указание намерений: Чётко сообщает другим разработчикам, что интерфейс предназначен для использования с лямбда-выражениями или ссылками на методы.
Без аннотации интерфейс может быть функциональным «де-факто», но лишается этой защитной проверки компилятора.