Ответ
Нет, не может. Функциональный интерфейс (FI) должен иметь ровно один абстрактный метод (SAM — Single Abstract Method). Это необходимо для работы лямбда-выражений и ссылок на методы.
Что МОЖЕТ содержать функциональный интерфейс помимо одного абстрактного метода:
default-методы (с реализацией).static-методы.- Абстрактные методы, унаследованные от
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 однозначно реализует этот единственный метод, и компилятору не нужно гадать, какой именно метод реализовывать.