Ich lese den Code von Guava, wo ich die Anmerkung java.util.@Nullable
in einem Code gefunden habe. Ich kenne die Bedeutung von @Nullable
, aber ich verstehe diese nicht. Insbesondere kann ich keine Klasse finden, die Nullable
im Paket aufgerufen wird java.util
. Bitte, jemand sagt mir, was das bedeutet java.util.@Nullable
:
public static <T> java.util.@Nullable Optional<T> toJavaUtil(
@Nullable Optional<T> googleOptional) {
return googleOptional == null ? null : googleOptional.toJavaUtil();
}
Nullable
, worüber sie reden, scheint drin zu seinjavax.annotation
, nichtjava.util
.public static <T> @Nullable java.util.Optional<T> toJavaUtil
, aber dass Java es Ihnen einfach nicht erlaubt, es so zu schreiben?public static <T> @Nullable java.util.Optional<T> toJavaUtil
ist zwar nicht möglich, aber es gibt keinen Grund, den FQN zu verwenden,Optional
wenn der Import bereits vorhanden ist.Optional
Bereich.@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.
Antworten:
Die Zeile
public static <T> java.util.@Nullable Optional<T> toJavaUtil
ist so geschrieben, weil der übliche Stilpublic static <T> @Nullable java.util.Optional<T> toJavaUtil
ungültig ist. Dies ist im JLS §9.7.4 definiert :Die Typdeklaration von
org.checkerframework.checker.nullness.qual@Nullable
lautet:Es gilt also für diese Regel.
Dass diese Struktur die Ausführung nicht unterbricht, da Paket-
java.util
und KlassennameOptional
aufgeteilt wurden, zeigt sich am folgenden kompilierten Codejavap -c [compiled class name]
:(
blub.Optional
ist 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:
Kann jedoch akzeptabel werden, wenn die Annotation zusätzlich den Zieltyp erhält
ElementType.FIELD
, wie in derselben JLS-Klausel geschrieben:quelle
Wenn Sie Anmerkungen verwenden, ist dies die Syntax, die verwendet wird, wenn Sie einen vollständig qualifizierten Namen für den Typ schreiben möchten, anstatt eine Importanweisung hinzuzufügen.
Zitat aus dem Checker Framework Handbuch :
Es wird auch auf Seite 2 der JSR308- Spezifikation erwähnt, die hier heruntergeladen werden kann . Es sagt:
quelle
Das Seltsame hier ist wirklich die ungewohnte Syntax zum Anwenden einer
ElementType.TYPE_USE
zielgerichteten Annotation. Wenn Sie die Dokumente des Nullable überprüfen , sehen Sie das unbekannte Ziel:Diese Anmerkung wird direkt vor dem einfachen Namen des mit Anmerkungen versehenen Typs verwendet, wie in beiden folgenden Fällen:
Ich wusste nicht, wie diese Art von Ziel verwendet wurde, und so kam ich nach einem kurzen Lesen zu diesem einfachen Beispiel, in dem Metadaten vom Rückgabetyp mithilfe einer Anmerkung mit diesem Ziel erfasst werden:
Und verarbeitet es mit:
Ich bin sicher, dass viele nützliche Frameworks, wie z. B. checkerframework, am besten geeignet sind
ElementType.TYPE_USE
quelle