-
@Documented @Retention(RUNTIME) @Target({CONSTRUCTOR,METHOD}) public @interface SafeVarargs
注釈の付いたメソッドやコンストラクタの本体が自身の可変パラメータに対して安全でない可能性のある操作を実行しないことを示す、プログラマ・アサーションです。 メソッドまたはコンストラクタにこの注釈を適用すると、型情報保持可能でない可変引数(vararg)型に関する未検査警告が抑制されるほか、パラメータ化された配列のコール・サイトでの作成に関する未検査警告も抑制されます。コンパイラは、この注釈型の
@Target
メタ注釈によって課される使用制限のほかに、その追加の使用制限を実装する必要があります。メソッドまたはコンストラクタの宣言に@SafeVarargs
注釈が付いていて、次のいずれかが成り立つ場合、コンパイル時にエラーが発生します。- 宣言が固定引数のメソッドまたはコンストラクタである
- 宣言は、
static
でもfinal
でもprivate
でもない可変アリティ・メソッドです。
メソッドまたはコンストラクタの宣言にこの注釈型が適用され、かつ次が成り立つ場合には、コンパイラから警告が発行されることが推奨されます。
- 可変パラメータが情報保持可能な要素型(プリミティブ型
Object
やString
を含む)を持つ。 (この注釈型で抑制される未検査警告は、型情報保持可能な要素型ではまだ起こらない。) - メソッドまたはコンストラクタの宣言の本体で、安全でない可能性のある操作(未検査警告が生成される、可変パラメータの配列の要素への代入など)が実行される。 一部の安全でない操作では未検査警告が起動されない。 たとえば、次のような別名を使用すると、
実行時に@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
が発生します。プラットフォームの将来のバージョンでは、そのような安全でない操作ではコンパイラのエラーが必須となる可能性があります。
- 導入されたバージョン:
- 1.7
- Java™言語仕様を参照します:
- 4.7 具象化可能型、8.4.1 仮パラメータ、9.6.4.7 @SafeVarargs