@SafeVarargs在JDK 7中引入,主要目的是處理可變長參數中的泛型,此註解告訴編譯器:在可變長參數中的泛型是類型安全的。可變長參數是使用數組存儲的,而數組和泛型不能很好的混合使用。html
數組元素的數據類型在編譯和運行時都是肯定的,而泛型的數據類型只有在運行時才能肯定下來,所以當把一個泛型存儲到數組中時,編譯器在編譯階段沒法檢查數據類型是否匹配,所以會給出警告信息。java
這裏使用了-Xlint:unchecked參數,排查出未經檢查的和不安全的操做。其實這裏的代碼是沒有問題的,因此加上註解能夠經過編譯。windows
@SafeVarargs註解只能用在參數長度可變的方法或構造方法上,且方法必須聲明爲static或final,不然會出現編譯錯誤。數組
還有一種是錯誤使用的方式,好比下面的代碼加上@SafeVarargs註解能夠經過編譯,可是你看看能發現什麼問題?安全
而且咱們編譯是能夠經過的oracle
可是咱們這裏去掉@SafeVarargs後,從新編譯,會曝出以下錯誤,可能受到污染,可是還要本身查的哈!工具
參考:http://softlab.sdut.edu.cn/blog/subaochen/2017/04/safevarargs%E7%9A%84%E7%94%A8%E6%B3%95/3d
對於javac命令是官方給咱們提供的編譯工具,可是咱們還有不少Non-Standard Options能夠選擇,這麼多不熟悉的操做真的讓人眼花繚亂,能夠打印出編譯過程當中遇到的警告,以下圖:htm