Подтвердить что ты не робот

Почему у @FunctionalInterface есть удержание RUNTIME?

Сказано в Javadoc:

Если тип аннотируется с этим типом аннотации, компиляторы требуется для генерации сообщения об ошибке, если...

Почему нет SOURCE или CLASS достаточно, например, для @Override.

4b9b3361

Ответ 1

Аннотация @FunctionalInterface служит двум целям. Что касается компилятора и ошибки, которую он должен сгенерировать, было бы достаточно иметь SOURCE RetentionPolicy, поскольку в этом отношении он влияет только на сам класс, аннотированный с помощью @FunctionalInterface.

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

Поэтому он аннотируется с @Documented и имеет максимум RetentionPolicy для выполнения второй цели.

Ответ 2

"Source" будет недостаточно, поскольку, если вы, например, создаете API и предоставляете свой класс в качестве предварительно скомпилированного jar, информация больше не будет доступна для компилятора.

Я считаю, что "класс" также не будет достаточным, если вы хотите поддерживать такие компиляторы, которые "компилируются" против класса во время выполнения, например, механизмы сценариев, которые используют отражение, чтобы узнать об этих аннотациях и должны показать предупреждение, слишком.

Ответ 3

@FunctionalInterface предназначен для проверки выполнения, проверки компиляции и процесса выполнения Java.

javap используется для декомпилирования и сравнения двух интерфейсов: один с @FunctionalInterface, другой - нет.

Просто добавьте два байта байта в теге @FunctionalInterface:

Constant pool:
   #7 = ...   RuntimeVisibleAnnotations
   #8 = ...   Ljava/lang/FunctionalInterface;

И реализация /lambda express одинакова на уровне байтового кода.

За исключением отображения интерфейса:

X.class.getAnnotation(FunctionalInterface.class) == null?;