Если тип аннотируется с этим типом аннотации, компиляторы требуется для генерации сообщения об ошибке, если...
Почему нет SOURCE
или CLASS
достаточно, например, для @Override
.
Если тип аннотируется с этим типом аннотации, компиляторы требуется для генерации сообщения об ошибке, если...
Почему нет SOURCE
или CLASS
достаточно, например, для @Override
.
Аннотация @FunctionalInterface
служит двум целям. Что касается компилятора и ошибки, которую он должен сгенерировать, было бы достаточно иметь SOURCE
RetentionPolicy
, поскольку в этом отношении он влияет только на сам класс, аннотированный с помощью @FunctionalInterface
.
Однако он имеет вторую цель, документируя тот факт, что использование этого interface
в качестве функционального интерфейса действительно предназначено и возможность использовать его таким образом, а не просто совпадение, например, с. Comparable
, который не предназначен для использования таким образом.
Поэтому он аннотируется с @Documented
и имеет максимум RetentionPolicy
для выполнения второй цели.
"Source" будет недостаточно, поскольку, если вы, например, создаете API и предоставляете свой класс в качестве предварительно скомпилированного jar, информация больше не будет доступна для компилятора.
Я считаю, что "класс" также не будет достаточным, если вы хотите поддерживать такие компиляторы, которые "компилируются" против класса во время выполнения, например, механизмы сценариев, которые используют отражение, чтобы узнать об этих аннотациях и должны показать предупреждение, слишком.
@FunctionalInterface
предназначен для проверки выполнения, проверки компиляции и процесса выполнения Java.
javap используется для декомпилирования и сравнения двух интерфейсов: один с @FunctionalInterface
, другой - нет.
Просто добавьте два байта байта в теге @FunctionalInterface
:
Constant pool:
#7 = ... RuntimeVisibleAnnotations
#8 = ... Ljava/lang/FunctionalInterface;
И реализация /lambda express одинакова на уровне байтового кода.
За исключением отображения интерфейса:
X.class.getAnnotation(FunctionalInterface.class) == null?;