Можем ли мы применить аннотацию @FunctionalInterface к абстрактным классам в Java?

Я знаю, что его можно применить к интерфейсу, но поскольку интерфейсы с методами по умолчанию (интерфейсы Java 8+) теперь очень близки к абстрактным классам, просто интересно, можем ли мы использовать @FunctionalInterface с абстрактными классами< /сильный>?

Если нет, то почему мы не можем?


person Pramod S. Nikam    schedule 10.03.2019    source источник
comment
Вы пробовали?   -  person Andronicus    schedule 10.03.2019
comment
как видно, его имя используется только для интерфейсов. и вы можете протестировать его.   -  person Hadi J    schedule 10.03.2019
comment
Нет, FI был создан исключительно для облегчения лямбда-выражений.   -  person Vishwa Ratna    schedule 11.03.2019


Ответы (3)


Вы не можете применить @FunctionalInterface к абстрактному классу, перечислению или другой аннотации. Из документа по Java:

Если тип аннотирован этим типом аннотации, компиляторы должны генерировать сообщение об ошибке, если только:

  • Тип является типом интерфейса, а не типом аннотации, перечислением или классом.
  • Аннотированный тип удовлетворяет требованиям функционального интерфейса.

Подробнее см. Абстрактный класс как функциональный интерфейс

person Ruslan    schedule 10.03.2019
comment
Любая причина, по которой мы не можем? - person Pramod S. Nikam; 10.03.2019
comment
@PraJazz см. здесь для более подробной информации stackoverflow.com/questions/ 24610207/ - person Ruslan; 10.03.2019

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

Ошибка: (10, 1) java: непредвиденная аннотация @FunctionalInterface xxx не является функциональным интерфейсом

Но это не большая проблема, так как это всего лишь маркерный интерфейс для интерфейсов с одним методом.

person Andronicus    schedule 10.03.2019

Функциональный интерфейс предназначен для конкретной цели. Он используется только с интерфейсами, которые имеют строго один и только один абстрактный метод. если нет, то компилятор жалуется -

Invalid '@FunctionalInterface' annotation; TestInterface is not a functional interface

Eclipse показывает ошибку

И нет смысла использовать это с любым другим классом, enum stuffs

person Arvind Kumar    schedule 10.03.2019