为什么 @SafeVarargs 在 Java 9 中是必需的?


varargs 函数在 Java 中引入,目的是在不借助类型参数或相同函数的重载版本的情况下方便创建带有可变数量参数的方法。

在 Java 9 版本之前,如果将vararg 方法泛型一起使用,就有一条警告消息。即使不是所有方法都创建堆污染,编译器仍会对所有带有泛型的 vararg 方法显示警告。这就是 Java 9 版本中添加@SafeVarargs 概念的原因,以避免这些警告。如果添加此注解,编译器就会停止显示这些警告。

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

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]


以下示例中,我们在私有方法前应用了@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]

更新于: 2020-03-24

195 次浏览

开启你的 职业

完成课程,获得认证

开始
广告