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

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

Ответ

Нет, не может. Функциональный интерфейс (FI) должен иметь ровно один абстрактный метод (SAM — Single Abstract Method). Это необходимо для работы лямбда-выражений и ссылок на методы.

Что МОЖЕТ содержать функциональный интерфейс помимо одного абстрактного метода:

  1. default-методы (с реализацией).
  2. static-методы.
  3. Абстрактные методы, унаследованные от java.lang.Object (например, toString(), equals()). Компилятор не считает их нарушением правила SAM.

Пример корректного функционального интерфейса:

@FunctionalInterface // Аннотация помогает компилятору проверить условие
interface DataProcessor<T> {
    // Единственный абстрактный метод (SAM)
    T process(T input);

    // default-метод — разрешен
    default void logProcessing() {
        System.out.println("Processing started...");
    }

    // static-метод — разрешен
    static <T> boolean isValid(T data) {
        return data != null;
    }
    // Методы equals() и hashCode() — не нарушают контракт, так как унаследованы от Object
}

Почему только один метод? Потому что лямбда-выражение input -> output однозначно реализует этот единственный метод, и компилятору не нужно гадать, какой именно метод реализовывать.