-
@Documented @Retention(RUNTIME) @Target({CONSTRUCTOR,METHOD}) public @interface SafeVarargs
程序员断言注释方法或构造函数的正文不会对其varargs参数执行潜在的不安全操作。 将此注释应用于方法或构造函数可抑制关于不可重新引用的变量arity(vararg)类型的未经检查的警告,并禁止在调用站点创建参数化数组的未检查警告。除了其
@Target
元注释的使用限制外,还需要编译器对此注释类型实施其他使用限制; 如果使用@SafeVarargs
注释注释方法或构造函数声明,则它是编译时错误,并且:- 声明是一种固定的方法或构造函数
- 声明是一个可变参数数量方法既不是
static
也不final
也不private
。
当这种注释类型应用于方法或构造函数声明时,鼓励编译器发出警告:
- 可变参数参数具有可重新定义的元素类型,其中包含基本类型,
Object
和String
。 (可注释元素类型不会发生此注释类型禁止的未选中的警告。) - 方法或构造函数声明的正文执行潜在的不安全操作,例如对生成未经检查的警告的变量arity参数数组的元素的赋值。 某些不安全的操作不会触发未检查的警告。 例如,
@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
- See The Java™ Language Specification:
- 4.7可重用类型,8.4.1正式参数,9.6.4.7 @SafeVarargs