Я читаю код Guava, где я нашел аннотацию java.util.@Nullable
в некотором коде. Я знаю значение @Nullable
, но я не понимаю этого. В частности, я не могу найти класс с именем Nullable
в пакете java.util
. Пожалуйста, кто-нибудь, скажите мне, что это значит java.util.@Nullable
:
public static <T> java.util.@Nullable Optional<T> toJavaUtil(
@Nullable Optional<T> googleOptional) {
return googleOptional == null ? null : googleOptional.toJavaUtil();
}
Nullable
они говорят, похожеjavax.annotation
, нетjava.util
.public static <T> @Nullable java.util.Optional<T> toJavaUtil
, но Java просто не позволяет вам так писать?public static <T> @Nullable java.util.Optional<T> toJavaUtil
действительно невозможен, но нет причин использовать FQN,Optional
когда импорт уже существует.Optional
сфера.@Nullable java.util.List The correct Java syntax to write an annotation on a fully-qualified type name is to put the annotation on the simple name part, as in java.util.@Nullable List. But, it’s usually better to add import java.util.List to your source file, so that you can just write @Nullable List.
Ответы:
Строка
public static <T> java.util.@Nullable Optional<T> toJavaUtil
написана так, потому что обычный стильpublic static <T> @Nullable java.util.Optional<T> toJavaUtil
недопустим. Это определено в JLS § 9.7.4 :Объявление типа
org.checkerframework.checker.nullness.qual@Nullable
:Так что это относится к этому правилу.
То, что эта структура не нарушает выполнение, так как имя пакета
java.util
и классаOptional
были разделены, можно увидеть, когда мы смотрим на скомпилированный код, используяjavap -c [compiled class name]
:(
blub.Optional
это локальный класс, в который я скопировал код Guava, чтобы получить минимальный пример для де-компиляции)Как видите, аннотации там больше не существует. Это только маркер для компилятора, который предотвращает предупреждение, когда метод возвращает null (и подсказку для читателей исходного кода), но он не будет включен в скомпилированный код.
Эта ошибка компилятора также относится к таким переменным, как:
Но может стать приемлемым, когда аннотация дополнительно получает целевой тип
ElementType.FIELD
, как написано в том же предложении JLS:источник
При использовании аннотаций этот синтаксис используется, когда вы хотите написать полное имя для типа вместо добавления оператора импорта.
Цитирование из руководства фреймворка :
Это также упоминается на странице 2 спецификации JSR308, которую можно скачать здесь . Это говорит:
источник
Странным
ElementType.TYPE_USE
моментом здесь действительно является незнакомый синтаксис для применения -направленной аннотации. Если вы проверите документы Nullable , вы увидите незнакомую цель:Эта аннотация используется непосредственно перед простым именем аннотированного типа, как в обоих следующих случаях:
Я не знал, для чего использовался этот тип цели, поэтому после быстрого прочтения я подошел к этому простому примеру, который выбирает метаданные типа возврата с помощью аннотации с такой целью:
И обработал это используя:
Я уверен, что многие полезные фреймворки, такие как checkerframework, делают наиболее подходящее использование
ElementType.TYPE_USE
источник