Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Java: Java, functional interface, default method, lambda, SAM

Влияют ли default методы на функциональный интерфейс?

Вопрос проверяет понимание default-методов в Java 8 и их влияние на определение функциональных интерфейсов.

Короткий ответ

Default-методы не влияют на статус интерфейса как функционального. Функциональный интерфейс должен иметь ровно один абстрактный метод (SAM). Default-методы имеют реализацию по умолчанию, поэтому они не считаются абстрактными. Интерфейс может содержать любое количество default-методов и при этом оставаться функциональным, если абстрактный метод всего один. Это позволяет расширять интерфейсы, не ломая существующий код, работающий с лямбда-выражениями.

Длинный ответ

В Java 8 появились default-методы (методы по умолчанию) в интерфейсах, которые имеют реализацию. Это важное изменение, но оно не нарушает определение функционального интерфейса.

Что такое функциональный интерфейс?

Функциональный интерфейс — это интерфейс, который содержит ровно один абстрактный метод (Single Abstract Method — SAM). Именно этот единственный абстрактный метод определяет контракт, который можно реализовать с помощью лямбда-выражения или ссылки на метод.

Роль default-методов

Default-методы имеют тело (реализацию) и помечаются ключевым словом default. Они не являются абстрактными, поэтому не учитываются при подсчёте абстрактных методов. Это позволяет добавлять новую функциональность в интерфейсы, не нарушая обратной совместимости с классами, которые уже реализуют этот интерфейс.

Пример интерфейса с default-методом

Рассмотрим интерфейс Calculator, который является функциональным, несмотря на наличие default-метода.

@FunctionalInterface
interface Calculator {
    // Единственный абстрактный метод — SAM
    int calculate(int x, int y);
    
    // Default-метод — имеет реализацию, не абстрактный
    default void printResult(int x, int y) {
        System.out.println("Result: " + calculate(x, y));
    }
}

public class Main {
    public static void main(String[] args) {
        // Лямбда реализует абстрактный метод calculate
        Calculator adder = (a, b) -> a + b;
        System.out.println(adder.calculate(5, 3)); // 8
        adder.printResult(5, 3); // Вызов default-метода
    }
}

Интерфейс Calculator помечен аннотацией @FunctionalInterface, что гарантирует наличие только одного абстрактного метода. Метод printResult — default, поэтому он не нарушает это правило.

Где это применяется?

  • Расширение API: Библиотеки, такие как Java Collections Framework, используют default-методы для добавления новых методов (например, stream(), forEach()) в интерфейсы Collection, List, не ломая существующие реализации.
  • Миксины: Default-методы позволяют эмулировать множественное наследование поведения, предоставляя готовую реализацию в интерфейсе.
  • Функциональное программирование: Они позволяют обогащать функциональные интерфейсы (например, Predicate, Function) вспомогательными методами, сохраняя их пригодность для лямбда-выражений.

Вывод: Default-методы — это мощный инструмент для эволюции интерфейсов в Java. Они не влияют на статус интерфейса как функционального, поскольку не являются абстрактными. Используйте их, когда нужно добавить новую функциональность в интерфейс, не нарушая существующий код, особенно при работе с лямбда-выражениями и Stream API.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • Java

    Java

Ключевые слова

#Java

#functional interface

#default method

#lambda

#SAM

Подпишись на Java Developer в телеграм