泛型的補充理解:泛型將參數做爲變量能夠更靈活高效的複用功能相同的業務代碼,泛型能夠用Object的引用來實現參數"任意化",「任意化」帶來的缺點是要作顯式的強制類型轉換,而這種轉換是要求開發者對實際參數類型能夠預知的狀況下進行的。對於強制類型轉換錯誤的狀況,編譯器可能不提示錯誤,在運行的時候纔出現異常,這是自己就是一個安全隱患。
那麼泛型的好處就是在編譯的時候可以檢查類型安全,而且全部的強制轉換都是自動和隱式的。安全
這裏看兩個栗子:
一、定義打印一個集合元素ide
public static void print(List<?> list){ list.add("test"); //報錯,這裏對將來使用對類型是沒法肯定對 for (Object o: list ) { System.out.println(o); } }
二、父類 Animal 和幾個子類,如狗、貓等code
static int countLegs (List<? extends Animal > animals ) { int retVal = 0; for ( Animal animal : animals ) { retVal += animal.countLegs(); } return retVal; } static int countLegs1 (List< Animal > animals ){ int retVal = 0; for ( Animal animal : animals ) { retVal += animal.countLegs(); } return retVal; } public static void main(String[] args) { List<Dog> dogs = new ArrayList<>(); // 不會報錯 countLegs( dogs ); // 報錯 countLegs1(dogs); }
因此,對於不肯定或者不關心實際要操做的類型,可使用無限制通配符(尖括號裏一個問號,即 ),表示能夠持有任何類型。像 countLegs 方法中,限定了上屆,可是不關心具體類型是什麼,因此對於傳入的 Animal 的全部子類均可以支持,而且不會報錯。而 countLegs1 就不行。開發