阅读(2628) (6)

鸿蒙OS SafeVarargs

2022-04-28 16:12:09 更新

SafeVarargs

@Documented
@Retention(RUNTIME)
@Target({CONSTRUCTOR,METHOD})
public @interface SafeVarargs

程序员断言带注释的方法或构造函数的主体不会对其 varargs 参数执行潜在的不安全操作。 将此注释应用于方法或构造函数会抑制有关不可具体化的变量 arity (vararg) 类型的未经检查的警告,并抑制有关在调用站点创建参数化数组的未经检查的警告。

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

  • 声明是固定数量的方法或构造函数
  • 声明是一个既不是静态也不是最终的变量arity 方法。

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

  • 可变arity 参数具有可具体化的元素类型,包括原始类型、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。

该平台的未来版本可能会要求此类不安全操作出现编译器错误。