Czytam kod z Guawy, w którym znalazłem adnotację java.util.@Nullable
w jakimś kodzie. Znam znaczenie @Nullable
, ale nie rozumiem tego. W szczególności nie mogę znaleźć klasy o nazwie Nullable
w pakiecie java.util
. Proszę, ktoś powie mi, co to oznacza java.util.@Nullable
:
public static <T> java.util.@Nullable Optional<T> toJavaUtil(
@Nullable Optional<T> googleOptional) {
return googleOptional == null ? null : googleOptional.toJavaUtil();
}
Nullable
Mówią o nie wydaje się być wjavax.annotation
niejava.util
.public static <T> @Nullable java.util.Optional<T> toJavaUtil
, ale ta Java po prostu nie pozwala Ci pisać w ten sposób?public static <T> @Nullable java.util.Optional<T> toJavaUtil
rzeczywiście nie jest możliwe, ale nie ma powodu, aby używać nazwy FQN,Optional
gdy import już istnieje.Optional
zakres.@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.
Odpowiedzi:
Linia
public static <T> java.util.@Nullable Optional<T> toJavaUtil
jest napisana w ten sposób, ponieważ zwykły stylpublic static <T> @Nullable java.util.Optional<T> toJavaUtil
jest nieprawidłowy. Jest to zdefiniowane w JLS §9.7.4 :Deklaracja typu
org.checkerframework.checker.nullness.qual@Nullable
to:Dotyczy to tej reguły.
Że ta struktura nie przerywa wykonania, ponieważ
java.util
nazwa pakietu i klasyOptional
zostały podzielone, można zobaczyć, gdy spojrzymy na skompilowany kod za pomocąjavap -c [compiled class name]
:(
blub.Optional
jest klasą lokalną, do której skopiowałem kod Guava, aby uzyskać minimalny przykład do de- / kompilacji)Jak widać, adnotacja już tam nie istnieje. Jest to tylko znacznik kompilatora, który zapobiega ostrzeżeniu, gdy metoda zwraca null (i wskazówka dla czytników kodów źródłowych), ale nie zostanie uwzględniony w skompilowanym kodzie.
Ten błąd kompilatora dotyczy również zmiennych takich jak:
Ale może stać się akceptowalny, gdy adnotacja dodatkowo uzyska typ docelowy
ElementType.FIELD
, jak napisano w tej samej klauzuli JLS:źródło
W przypadku korzystania z adnotacji jest to składnia używana w celu zapisania w pełni kwalifikowanej nazwy typu zamiast dodawania instrukcji importu.
Cytowanie z podręcznika ram kontrolera :
Jest również wspomniany na stronie 2 specyfikacji JSR308, którą można pobrać tutaj . To mówi:
źródło
Dziwny jest tutaj nieznana składnia do zastosowania
ElementType.TYPE_USE
ukierunkowanej adnotacji. Jeśli sprawdzisz dokumenty Nullable , zobaczysz nieznany cel:Ta adnotacja jest używana tuż przed prostą nazwą typu adnotacji, jak w obu poniższych przypadkach:
Nie wiedziałem, do czego służy ten cel, więc po szybkim przeczytaniu doszedłem do tego prostego przykładu, w którym przy pomocy adnotacji, która ma ten cel, wychwytuje metadane typu zwracanego:
I przetworzył to za pomocą:
Jestem pewien, że wiele użytecznych frameworków, takich jak checkerframework, najlepiej wykorzystuje
ElementType.TYPE_USE
źródło