Die Zeile public static <T> java.util.@Nullable Optional<T> toJavaUtilist so geschrieben, weil der übliche Stil public static <T> @Nullable java.util.Optional<T> toJavaUtilungültig ist. Dies ist im JLS §9.7.4 definiert :
Es ist ein Fehler zur Kompilierungszeit, wenn eine Annotation vom Typ T für einen Typ (oder einen Teil eines Typs) in einem Typkontext gilt und T in Typkontexten anwendbar ist und die Annotation nicht zulässig ist.
Nehmen Sie beispielsweise einen Annotationstyp TA an, der mit just meta-annotiert ist @Target(ElementType.TYPE_USE). Die Begriffe @TA java.lang.Objectund java.@TA lang.Objectsind illegal, da der einfache Name, dem @TA am nächsten liegt, als Paketname klassifiziert wird. Auf der anderen Seite java.lang.@TA Objectist legal.
Die Typdeklaration von org.checkerframework.checker.nullness.qual@Nullablelautet:
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
Es gilt also für diese Regel.
Dass diese Struktur die Ausführung nicht unterbricht, da Paket- java.utilund Klassenname Optionalaufgeteilt wurden, zeigt sich am folgenden kompilierten Code 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.Optionalist eine lokale Klasse, in die ich den Guava-Code kopiert habe, um ein minimales Beispiel zum De- / Kompilieren zu erhalten)
Wie Sie sehen, existiert die Anmerkung dort nicht mehr. Es ist nur eine Markierung für den Compiler, um eine Warnung zu verhindern, wenn die Methode null zurückgibt (und ein Hinweis für die Quellcodeleser), aber sie wird nicht in den kompilierten Code aufgenommen.
Dieser Compilerfehler gilt auch für Variablen wie:
private @Nullable2 java.util.Optional<?> o;
Kann jedoch akzeptabel werden, wenn die Annotation zusätzlich den Zieltyp erhält ElementType.FIELD, wie in derselben JLS-Klausel geschrieben:
Wenn TA zusätzlich mit Meta-Annotationen versehen ist @Target(ElementType.FIELD), ist der Begriff @TA java.lang.Objectan Orten zulässig, die sowohl Deklarations- als auch Typkontexte sind, z. B. eine Felddeklaration @TA java.lang.Object f;. Hier gilt @TA für die Deklaration von f (und nicht für den Typ java.lang.Object), da TA im Kontext der Felddeklaration anwendbar ist.
Nullable, worüber sie reden, scheint drin zu seinjavax.annotation, nichtjava.util.