Java 9 @SafeVarargs注解

Java 9 @SafeVarargs注解

文章图片
它是一个注释, 适用于采用varargs参数的方法或构造函数。它用于确保该方法不会对其varargs参数执行不安全的操作。
它已包含在Java7中, 并且只能应用于
  • 最终方法
  • 静态方法
  • 建设者
从Java 9开始, 它也可以与私有实例方法一起使用。
注意:@SafeVarargs批注只能应用于无法覆盖的方法。应用到其他方法将引发编译时错误。
让我们看一些示例, 在第一个示例中, 我们没有使用@SafeVarargs批注和编译代码。走着瞧吧?
Java 9 @SafeVarargs注释示例
import java.util.ArrayList; import java.util.List; public class SafeVar{ private void display(List< String> ... products) { // Not using @SaveVarargs for (List< String> product : products) { System.out.println(product); } } public static void main(String[] args) { SafeVar p = new SafeVar(); List< String> list = new ArrayList< String> (); list.add("Laptop"); list.add("Tablet"); p.display(list); } }

它在编译时生成警告消息, 但编译时没有错误。
输出:
At compile time: Note: SafeVar.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. At runtime: [Laptop, Tablet]

这是由编译器生成的有关不安全varargs类型的警告。
为了避免这种情况, 我们应该对方法使用@SaveVarargs表示法, 就像在下面的示例中所做的那样。
Java 9 @SafeVarargs注释示例
import java.util.ArrayList; import java.util.List; public class SafeVar{ // Applying @SaveVarargs annotation @SafeVarargs private void display(List< String> ... products) { // Not using @SaveVarargs for (List< String> product : products) { System.out.println(product); } } public static void main(String[] args) { SafeVar p = new SafeVar(); List< String> list = new ArrayList< String> (); list.add("Laptop"); list.add("Tablet"); p.display(list); } }

现在, 编译器不会产生警告消息, 代码可以编译并成功运行。
输出:
[Laptop, Tablet]

注意:要将@SaveVarargs注释应用于私有实例方法, 请仅使用Java 9或更高版本来编译代码。 怎么了?如果我们使用旧版本的Java编译以下代码。
Java @SafeVarargs注释示例
import java.util.ArrayList; import java.util.List; public class SafeVar{ @SafeVarargs private void display(List< String> ... products) { for (List< String> product : products) { System.out.println(product); } } public static void main(String[] args) { SafeVar v = new SafeVar(); List< String> list = new ArrayList< String> (); list.add("Laptop"); list.add("Tablet"); v.display(list); } }

【Java 9 @SafeVarargs注解】输出:
SafeVar.java:6: error: Invalid SafeVarargs annotation. Instance method display(List< String> ...) is not final. private void display(List< String> ... products) { ^ Note: SafeVar.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 1 error

    推荐阅读