Разница между аннотациями объявлений и аннотациями типов - PullRequest
0 голосов
/ 01 мая 2018

Java 8 представила аннотации типов с JSR308. Согласно спецификации языка Java

примечания типа могут использоваться везде, где используется тип, например объявления, общие аргументы, приведение и т. д.

Я относительно новичок в Java, Java 8 была первой версией Java, которую я использовал, поэтому я не знаком с аннотациями не-типа, то есть аннотациями объявлений.

Чем аннотации объявлений отличаются от аннотаций типов? Я хочу знать, потому что я постоянно слышу о них в руководствах, и похоже, что «аннотации типов» - это расширенный набор «аннотаций объявлений».

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Как аннотации типов, так и аннотации объявлений все еще существуют в Java, и они различны и не перекрываются.

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

Например, тип int содержит значения ..., -2, -1, 0, 1, 2, ...
Тип @Positive int содержит значения 1, 2, ...
Следовательно, @Positive int является подтипом int.

A аннотация объявления может быть записана в любом объявлении (классе, методе или переменной). Он описывает объявленную вещь, но не описывает значения времени выполнения. Вот примеры аннотаций объявлений:

@Deprecated
class MyClass { ... }

говорит, что программисты не должны использовать MyClass.

@Override
void myMethod() { ... }

говорит, что myMethod переопределяет объявление в суперклассе или интерфейсе.

@SuppressWarnings(...)
int myField = INITIALIZATION-EXPRESSION;

говорит, что компилятор не должен выдавать предупреждения о коде в выражении инициализации.

Вот примеры, которые используют как аннотацию объявления, так и аннотацию типа:

@Override
@NonNull String myMethod() { ... }

@GuardedBy("myLock")
@Regex String myField;

Обратите внимание, что аннотация типа описывает значение, а аннотация объявления что-то говорит о методе или использовании поля.

По стилю аннотации объявлений пишутся в отдельной строке, а аннотации типов пишутся непосредственно перед типом в той же строке.

0 голосов
/ 01 мая 2018

Большинство аннотаций прямо сейчас являются аннотациями деклараций, например @Override:

class Foo implements Runnable {
    @Override // applies to the declaration of Foo.run()
    public void run() {
    }
}

Аннотации типов расширяют возможные цели аннотаций для использования типов, которые являются не объявлениями (приведение, аргументы типа и т. Д.). Аннотации типов могут появляться в объявлениях , но аннотации типов не являются расширенным набором аннотаций объявлений. Например, @Override никогда не является аннотацией типа.

В случаях, которые неоднозначны, например, @Foo int x;, JLS §9.7.4 описывает конкретные правила для того, является ли объявление или тип аннотированным . В некоторых случаях это даже считается как.

Ниже приведено несколько однозначных примеров аннотаций типов:

// cast
String str = (@Foo String) take();
// type argument
List<@Foo String> list = new ArrayList<>();

Полагаю, я мог бы также добавить, что проблема с аннотациями типов в настоящее время заключается в том, что нет официального API, который позволял бы процессору аннотаций (в основном плагину компилятора) делать с ними что-то значимое. В результате этого аннотации типов обычно используются только сторонними инструментами, такими как Lombok и компилятор Eclipse.

...