java遺珠之@SafeVarargs
版權宣告:本文為博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/lastsweetop/article/details/82863417
當使用泛型作為可變引數時,因為可變引數是陣列型別,在編譯之後泛型會被擦出掉,那麼傳入引數就成了unchecked的警告:
如下例子
public class VarargsWaring { private static List<String> useVarargs(List<String>... args) { return args.length > 0 ? args[0] : null; } public static void main(String[] args) { List<String> list = new ArrayList<>(); System.out.println(VarargsWaring.useVarargs(list)); } }
像我們開始講的那樣,型別是會經過擦除,如果程式碼改成
public class VarargsWaring { private static List<String> useVarargs(List<String>... args) { return args.length > 0 ? args[0] : null; } public static void main(String[] args) { List list = new ArrayList<Integer>(); System.out.println(VarargsWaring.useVarargs(list)); } }
依然可以編譯通過,如果方法裡進一步對String進行操作,那麼就會報執行時異常。
在此編譯器給出警告,如果你非常確認你所有的呼叫都沒有型別未檢查的錯誤,那麼你可以使用SafeVarargs
來忽略此警告
public class VarargsWaring { @SafeVarargs private static List<String> useVarargs(List<String>... args) { return args.length > 0 ? args[0] : null; } public static void main(String[] args) { List list = new ArrayList<String>(); System.out.println(VarargsWaring.useVarargs(list)); } }