为什么Java 9需要@SafeVarargs?

可变参数 的功能已在Java中被引入,以促进与的参数的变量数的方法的创建不诉诸数组类型参数或同样的方法的重载版本。

在Java 9版本之前,如果将vararg方法泛型一起使用,则会出现警告消息。即使并非所有方法都会造成堆污染,编译器仍会针对泛型使用的所有vararg方法显示警告 。这就是@SafeVarargs概念被添加到Java 9版本中以避免这些警告的原因。如果添加了此注释,则编译器将停止这些警告。

我们可以使用以下命令来编译代码

javac -Xlint:unchecked SafeVarargsTest1.java

在下面的示例中,编译器向用户显示警告消息。

示例

import java.util.Arrays;
import java.util.List;

public class SafeVarargsTest1 {
   public static void main(String args[]) {
      SafeVarargsTest1 test = new SafeVarargsTest1();
      test.varargsMethod(Arrays.asList("Adithya", "Jaidev"), Arrays.asList("Raja", "Chaitanya"));
   }
   private void varargsMethod(List<String>... list) {
      for(List list1: list)
         System.out.println(list1);
   }
}

输出结果

SafeVarargsTest.java:7: warning: [unchecked] unchecked generic array creation for varargs parameter of type List[]
test.varargsMethod(Arrays.asList("Adithya", "Jaidev"), Arrays.asList("Raja", "Chaitanya"));
^
SafeVarargsTest.java:9: warning: [unchecked] Possible heap pollution from parameterized vararg type List
private void varargsMethod(List... list) {
^
2 warnings[Adithya, Jaidev]
[Raja, Chaitanya]


n个下面的例子中,我们已经申请@SafeVarargs的前私有方法。因此,它不会显示任何警告消息。

示例

import java.util.Arrays;
import java.util.List;

public class SafeVarargsTest2 {
   public static void main(String args[]) {
      SafeVarargsTest2 test = new SafeVarargsTest2();
      test.varargsMethod(Arrays.asList("Adithya", "Jaidev"), Arrays.asList("Raja", "Chaitanya"));
   }
   @SafeVarargs   private void varargsMethod(List<String>... list) {
      for(List list1: list)
         System.out.println(list1);
   }
}

输出结果

[Adithya, Jaidev]
[Raja, Chaitanya]