。@のNullable java.utilでの意味は何ですか?

setdaemon:

私が読んでいるグァバのコード私は、アノテーションを発見した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.Objectjava.@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の宣言に適用されると考えられます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=305087&siteId=1
おすすめ