Linia public static <T> java.util.@Nullable Optional<T> toJavaUtiljest napisana w ten sposób, ponieważ zwykły styl public static <T> @Nullable java.util.Optional<T> toJavaUtiljest nieprawidłowy. Jest to zdefiniowane w JLS §9.7.4 :
Jest to błąd czasu kompilacji, jeśli adnotacja typu T dotyczy typu (lub dowolnej części typu) w kontekście typu, a T ma zastosowanie w kontekstach typu, a adnotacja nie jest dopuszczalna.
Na przykład załóżmy, że adnotacja typu TA ma meta-adnotację za pomocą just @Target(ElementType.TYPE_USE). Warunki @TA java.lang.Objecti java.@TA lang.Objectsą nielegalne, ponieważ prosta nazwa, do której @TA jest najbliżej, jest klasyfikowana jako nazwa pakietu. Z drugiej strony java.lang.@TA Objectjest legalne.
Deklaracja typu org.checkerframework.checker.nullness.qual@Nullableto:
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
Dotyczy to tej reguły.
Że ta struktura nie przerywa wykonania, ponieważ java.utilnazwa pakietu i klasy Optionalzostały podzielone, można zobaczyć, gdy spojrzymy na skompilowany kod za pomocą javap -c [compiled class name]:
class just.a.test.Main {
just.a.test.Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static <T> java.util.Optional<T> toJavaUtil(blub.Optional<T>);
Code:
0: aload_0
1: ifnonnull 8
4: aconst_null
5: goto 12
8: aload_0
9: invokevirtual #2 // Method blub/Optional.toJavaUtil:()Ljava/util/Optional;
12: areturn
}
( blub.Optionaljest 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:
private @Nullable2 java.util.Optional<?> o;
Ale może stać się akceptowalny, gdy adnotacja dodatkowo uzyska typ docelowy ElementType.FIELD, jak napisano w tej samej klauzuli JLS:
Jeśli TA jest dodatkowo meta-adnotacja @Target(ElementType.FIELD), to termin @TA java.lang.Objectjest legalny w lokalizacjach, które są zarówno kontekstami deklaracji, jak i typów, takich jak deklaracja pola @TA java.lang.Object f;. W tym przypadku uważa się, że @TA ma zastosowanie do deklaracji f (a nie do typu java.lang.Object), ponieważ TA ma zastosowanie w kontekście deklaracji pola.
NullableMówią o nie wydaje się być wjavax.annotationniejava.util.