Module java.base
Package java.lang

Annotation Interface SafeVarargs


@Documented @Retention(RUNTIME) @Target({CONSTRUCTOR,METHOD}) public @interface SafeVarargs
一个程序员断言,被注解的方法或构造函数的主体不会对其可变参数执行潜在不安全的操作。将此注解应用于方法或构造函数会抑制关于非具体化的可变参数类型的未经检查警告,并抑制调用点处关于参数化数组创建的未经检查警告。

除了其@Target元注解所施加的使用限制外,编译器还必须对此注解类型实施额外的使用限制;如果一个方法或构造函数声明被标注为@SafeVarargs注解,并且:

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

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

  • 可变参数具有具体化元素类型,包括原始类型、ObjectString。(此注解类型抑制的未经检查警告已经不会发生在具体化元素类型上。)
  • 方法或构造函数声明的主体执行潜在不安全的操作,例如对可变参数数组的元素进行赋值会生成未经检查的警告。一些不安全的操作不会触发未经检查的警告。例如,在
     @SafeVarargs // 实际上并不安全!
     static void m(List<String>... stringLists) {
       Object[] array = stringLists;
       List<Integer> tmpList = Arrays.asList(42);
       array[0] = tmpList; // 语义上无效,但编译时没有警告
       String s = stringLists[0].get(0); // 哦,运行时会出现ClassCastException!
     }
     
    导致运行时ClassCastException

    平台的未来版本可能会对这类不安全操作强制编译器错误。

参见 Java 语言规范:
4.7 具体化类型
8.4.1 形式参数
9.6.4.7 @SafeVarargs
自版本:
1.7