私が読んでいるグァバのコード私は、アノテーションを発見したjava.util.@Nullable
いくつかのコードでは。私は、の意味を知っている@Nullable
、しかし、私はこの1つを理解していません。特に、私はと呼ばれるクラスを見つけることができない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();
}
ラインは、public static <T> java.util.@Nullable Optional<T> toJavaUtil
いつものスタイルがあるため、このように書かれているpublic static <T> @Nullable java.util.Optional<T> toJavaUtil
無効です。これは、で定義されているJLS§9.7.4:
タイプTの注釈タイプのコンテキストにおけるタイプ(又はタイプの任意の部分)に適用され、Tは、タイプコンテキストにおいて適用可能であり、注釈は許容しない場合には、コンパイル時エラーです。
例えば、メタ・アノテーションだけである注釈タイプTAをとります
@Target(ElementType.TYPE_USE)
。用語@TA java.lang.Object
とjava.@TA lang.Object
@TAが最も近い先の単純名がパッケージ名に分類されているため、違法です。一方、java.lang.@TA Object
合法です。
型宣言org.checkerframework.checker.nullness.qual@Nullable
されています。
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
だから、このルールに適用されます。
パッケージので、この構造は、実行を中断しないこと、java.util
およびクラス名はOptional
、分割した私たちが使用してコンパイルされたコードを見ると、見ることができます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.Optional
脱/コンパイルする最小の例を取得するために、私はグアバコードをコピーし、ローカルクラスは、です)
あなたが見ることができるように、注釈はもう存在しません。これは、メソッドがnull(およびソース・コード・リーダのためのヒント)を返し、それがコンパイルされたコードに含まれないとき警告を防ぐために、コンパイラのための唯一のマーカーです。
このコンパイラエラーは、のような変数に適用されます。
private @Nullable2 java.util.Optional<?> o;
注釈は、さらにターゲット・タイプを取得するときでも許容なることができElementType.FIELD
、同じJLS句に書かれたように、:
TAは、さらにメタ注釈付きである場合
@Target(ElementType.FIELD)
、次いで、この用語は、@TA java.lang.Object
そのようなフィールド宣言として宣言と型コンテキストの両方である場所で合法です@TA java.lang.Object f;
。TAフィールド宣言コンテキストに適用可能であるため、ここで、@TAは(としないタイプjava.lang.Object上位に)Fの宣言に適用されると考えられます。