原文: https://beginnersbook.com/2018/05/java-9-safevarargs-annotation/

Java 7 引入了@SafeVarargs注解来抑制当方法具有varargs(可变数量的参数)时出现的不安全操作警告。@SafeVarargs注解只能用于无法覆盖的方法(最终或静态方法或构造函数),因为重写方法仍然可以对其 varargs(可变数量的参数)执行不安全操作。

Java 9 扩展了@SafeVarargs注解的使用,它现在也可以与私有方法一起使用。这是因为无法覆盖私有方法。之前这个注解仅限于最终或静态方法或构造函数,但现在它可以与私有方法一起使用。

Java 9 示例 - 当我们不使用@SafeVarargs注解时?

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class JavaExample{
  4. // We are not using @SafeVarargs annotation - Java 9
  5. private void print(List... names) {
  6. for (List<String> name : names) {
  7. System.out.println(name);
  8. }
  9. }
  10. public static void main(String[] args) {
  11. JavaExample obj = new JavaExample();
  12. List<String> list = new ArrayList<String>();
  13. list.add("Kevin");
  14. list.add("Rick");
  15. list.add("Negan");
  16. obj.print(list);
  17. }
  18. }

警告:

  1. Type safety: Potential heap pollution via varargs parameter names
  2. Type safety: A generic array of List is created for a varargs
  3. parameter

输出:

  1. [Kevin, Rick, Negan]

正如你所看到的,代码运行良好但却没有产生任何警告。

Eclipse Oxygen IDE 中此代码的屏幕截图,显示警告。

Java 9 - `@SafeVarargs`注解 - 图1

Java 9 - @SafeVarargs注解示例

让我们在使用@SafeVarargs注解后再次运行相同的代码。

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class JavaExample{
  4. @SafeVarargs
  5. private void print(List... names) {
  6. for (List<String> name : names) {
  7. System.out.println(name);
  8. }
  9. }
  10. public static void main(String[] args) {
  11. JavaExample obj = new JavaExample();
  12. List<String> list = new ArrayList<String>();
  13. list.add("Kevin");
  14. list.add("Rick");
  15. list.add("Negan");
  16. obj.print(list);
  17. }
  18. }

相同的输出没有任何警告。

注意:如果您尝试在 Java 7 和 Java 8 中编译上述代码,您将收到编译错误,因为此增强功能在 Java 9 中完成,在 Java 9 之前 - 不允许使用私有方法标有此注解。