模块  java.base
软件包  java.lang

Annotation Type SafeVarargs


  • @Documented
    @Retention(RUNTIME)
    @Target({构造器,METHOD})
    public @interface SafeVarargs
    程序员断言,带注释的方法或构造函数的主体不会对其varargs参数执行可能不安全的操作。 将此批注应用于方法或构造函数会抑制有关不可重定义的变量arity(vararg)类型的未经检查的警告,并抑制有关在调用位置创建参数化数组的未经检查的警告。

    除了由其@Target元注释强加的使用限制外,编译器还需要对此注释类型实施其他使用限制; 如果方法或构造函数声明使用@SafeVarargs批注进行批注,则为编译时错误,并且:

    • 声明是一个固定的arity方法或构造函数
    • 声明是一个可变参数数量方法既不是static也不final也不private

    当此注释类型应用于方法或构造函数声明时,鼓励编译器发出警告,其中:

    • 变量arity参数具有可重构的元素类型,其包括基元类型, ObjectString (对于可重新生成的元素类型,此注释类型已禁止的未经检查的警告不会发生。)
    • 方法或构造函数声明的主体执行可能不安全的操作,例如对变量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