Определение функционального интерфейса: "Функциональный интерфейс - это интерфейс, который имеет только один абстрактный метод (помимо методов Object) и, таким образом, представляет собой контракт с одной функцией".
Согласно этому определению, Comparable<T>
определенно является функциональным интерфейсом.
Определение лямбда-выражения: "Лямбда-выражение похоже на метод: оно предоставляет список формальных параметров, а тело - выражение или блок - выражается в терминах этих параметров".
Оценка лямбда-выражения создает экземпляр функционального интерфейса.
Таким образом, цель лямбда-выражения состоит в том, чтобы иметь возможность создать экземпляр функционального интерфейса, реализуя единственную функцию функционального интерфейса. то есть. разрешить создание экземпляра с единственной функцией.
Давайте посмотрим на Comparable<T>
, предназначен ли этот интерфейс для использования в качестве единой функции? то есть. Был ли он предназначен для создания экземпляров только с этой единственной функцией?
Документация Comparable<T>
начинается с "Этот интерфейс налагает полное упорядочение на объекты каждого класса, который его реализует. Это упорядочение называется естественным упорядочением класса, а метод compareTo класса называется его естественным методом сравнения ".
Приведенное выше предложение поясняет, что Comparable<T>
не предназначен для использования в качестве отдельной функции, но всегда предназначен для реализации классом, который имеет естественное упорядочение для своих экземпляров, путем добавления этой единственной функции.
Что означало бы, что оно не предназначено для создания с помощью лямбда-выражения?
Дело в том, что у нас не было бы какого-либо объекта, который был бы только Comparable, он должен быть реализован и, таким образом, использован как дополнительная функция для класса.
Итак, есть ли способ в языке Java, с помощью которого предотвращается создание лямбда-выражения для Comparable<T>
? Может ли разработчик интерфейса решить, что этот интерфейс должен быть реализован классом, а не создан как экземпляр с помощью этого единственного метода с использованием лямбда-выражения?
Просто потому, что у интерфейса есть единственный абстрактный метод, его не следует рассматривать как функциональный интерфейс.
Возможно, если Java предоставляет аннотацию типа NotFunctional, компилятор может проверить, что этот интерфейс не используется для создания лямбда-выражения, например.
@NotFunctional
public interface Comparable<T> { public int compareTo(T t); }