模块 java.base
 java.lang

注解 SafeVarargs


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

除了其 @Target 元注解施加的使用限制外,编译器还需要对该注解类型实施额外的使用限制;如果使用 @SafeVarargs 注释对方法或构造函数声明进行注释,则这是一个编译时错误,并且:

  • 声明是一个固定的方法或构造方法
  • 声明是一个可变元数方法,既不是 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

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

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