在聲明具備模糊類型(好比:泛型)的可變參數的構造函數或方法時,Java編譯器會報unchecked警告。鑑於這些狀況,若是程序員判定聲明的構造函數和方法的主體不會對其varargs參數執行潛在的不安全的操做,可以使用@SafeVarargs進行標記,這樣的話,Java編譯器就不會報unchecked警告。html
先看看@SafeVarargs在Java SE中的聲明:java
package java.lang; import java.lang.annotation.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.CONSTRUCTOR, ElementType.METHOD}) public @interface SafeVarargs {}
由Java源代碼聲明咱們瞭解到:@SafeVarargs註解,只能用於標記構造函數和方法,因爲保留策略聲明爲RUNTIME,因此此註解能夠在運行時生效。程序員
使用的時候要注意:@SafeVarargs註解,對於非static或非final聲明的方法,不適用,會編譯不經過。spring
@SafeVarargs使用示例以下:安全
package org.springmorning.demo.javabase.annotation.pre; /** * @author 春晨 * @date 2019/1/19 9:26 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10285780.html */ public class SafeVarargsAnnotation<S>{ private S[] args; //構造函數能夠使用@SafeVarargs標記 @SafeVarargs public SafeVarargsAnnotation(S... args){ this.args = args; } //此處不能使用@SafeVarargs,由於此方法未聲明爲static或final方法,若是要抑制unchecked警告,能夠使用@SuppressWarnings註解 @SuppressWarnings("unchecked") //@SafeVarargs public void loopPrintArgs(S... args){ for (S arg : args) { System.out.println(arg); } } //final方法能夠使用@SafeVarargs標記 @SafeVarargs public final void printSelfArgs(S... args){ for (S arg : this.args) { System.out.println(arg); } } public static void main(String[] args) { SafeVarargsAnnotation.loopPrintInfo("A", "B", "C"); } //static方法能夠使用@SafeVarargs標記 @SafeVarargs public static <T> void loopPrintInfo(T ... infos){ for (T info : infos) { System.out.println(info); } } }
若是以上把@SafeVarargs標記註釋掉,在編譯時就會報unchecked警告:函數
加上@SafeVarargs註解,警告被抑制:oop
下節將給你們講解預約義註解@FunctionalInterface的使用this