為什麼 @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 次瀏覽

開啟你的 職業

完成課程,獲得認證

開始
廣告
© . All rights reserved.