モジュール java.base
パッケージ java.lang

注釈インタフェースSafeVarargs


@Documented @Retention(RUNTIME) @Target({CONSTRUCTOR,METHOD}) public @interface SafeVarargs
注釈の付いたメソッドやコンストラクタの本体が自身の可変パラメータに対して安全でない可能性のある操作を実行しないことを示す、プログラマ・アサーションです。 メソッドまたはコンストラクタにこの注釈を適用すると、型情報保持可能でない可変引数(vararg)型に関する未検査警告が抑制されるほか、パラメータ化された配列のコール・サイトでの作成に関する未検査警告も抑制されます。

コンパイラは、この注釈型の@Targetメタ注釈によって課される使用制限のほかに、その追加の使用制限を実装する必要があります。メソッドまたはコンストラクタの宣言に@SafeVarargs注釈が付いていて、次のいずれかが成り立つ場合、コンパイル時にエラーが発生します。

  • 宣言が固定引数のメソッドまたはコンストラクタである
  • 宣言は、staticでもfinalでもprivateでもない可変アリティ・メソッドです。

メソッドまたはコンストラクタの宣言にこの注釈型が適用され、かつ次が成り立つ場合には、コンパイラから警告が発行されることが推奨されます。

  • 可変パラメータが情報保持可能な要素型(プリミティブ型ObjectStringを含む)を持つ。 (この注釈型で抑制される未検査警告は、型情報保持可能な要素型ではまだ起こらない。)
  • メソッドまたはコンストラクタの宣言の本体で、安全でない可能性のある操作(未検査警告が生成される、可変パラメータの配列の要素への代入など)が実行される。 一部の安全でない操作では未検査警告が起動されない。 たとえば、次のような別名を使用すると、
     @SafeVarargs // Not actually safe!
     static void m(List<String>... stringLists) {
       Object[] array = stringLists;
       List<Integer> tmpList = Arrays.asList(42);
       array[0] = tmpList; // Semantically invalid, but compiles without warnings
       String s = stringLists[0].get(0); // Oh no, ClassCastException at runtime!
     }
     
    実行時にClassCastExceptionが発生します。

    プラットフォームの将来のバージョンでは、そのような安全でない操作ではコンパイラのエラーが必須となる可能性があります。

Java言語仕様を参照してください:
4.7 具象化可能型
8.4.1フォーマル・パラメータ
9.6.4.7 @SafeVarargs
導入されたバージョン:
1.7