2016-09-23 3 views
3

Как известно, Java 8 внедрила функциональное программирование для разработчиков Java.Как определить, работает ли интерфейс в Java?

Такие интерфейсы, как Comparator, Runnable, Callable и т. Д. Являются функциональными.

Как следует из определения: функциональные интерфейсы являются интерфейсами, которые имеют только один абстрактный метод.

Но, например, тот же интерфейс Comparator имеют более чем один абстрактные методы:

int compare(T o1, T o2); 

boolean equals(Object obj); // inherited from Object class 

// and a lot of concrete methods more 

Ну, есть ли строгое правило , как определить , если интерфейс является функциональным, так что он может использоваться как цель назначения для выражения лямбда или ссылки на метод?

+0

'булевы равно (OBJ объекта)' не наследуется из класса Object. Если бы это было так, это не было бы абстрактным. Интерфейс не является подтипом объекта. –

ответ

4

С JLS §9.8 (подсветкой шахты):

Функциональный интерфейс представляет собой интерфейс, который имеет только один абстрактный метод (в сторону от методов объекта)

Обоснованием является

  1. до , вам необходимо создать экземпляр. Каждый экземпляр обязательно наследует от Object и таким образом реализует эти абстрактные методы.

    Другой метод - boolean equals(Object) - это явное объявление абстрактного метода, который бы в противном случае неявно объявлен, и будет автоматически осуществляться каждый класс, который реализует интерфейс.

  2. В качестве функционального интерфейса очень маловероятно, что вы хотите вызвать метод, который определяется Object. Таким образом, эти методы не учитываются при поиске метода для вызова (поскольку метод функциональных интерфейсов можно назвать без, называя этот метод).

    Это позволит функциональное лечение интерфейс, как java.util.Comparator<T>, объявляющего несколько абстрактных методов, из которых только один действительно «новый» - int compare(T,T).

+0

Имея только абстрактный метод, исключая методы 'Object', поэтому может ли он иметь какое-то количество не абстрактных методов? – DimaSan

+1

Да, при определении функциональности интерфейса игнорируются не абстрактные методы. –

+0

спасибо @MartinNyolt – DimaSan

Смежные вопросы