java集合有個缺點——將一個對象放進集合之后,該對象的編譯類型就會變成Object類型(其運行時類型不變)編譯時不檢查對象的類型。
泛型概念:java的參數化類型,即在創建集合時指定集合元素的類型。
如,List<String> strList=new ArrayList<String>(); ?后面的String可省略不寫
strList.add(5); ? 會引起編譯錯誤,因為已經指定strList 集合存放的數據類型為String類型了,不能存放其他類型的對象。輸出時不用強制類型轉換。
泛型實質:允許在定義接口、類和方法時使用類型形參,類型形參將在聲明變量、創建對象和調用方法時動態的指定。
1 public class Apple<T> { 2 private T info; 3 public Apple(){ 4 } // 構造器名依然為Apple,而不是Apple<T> 5 public Apple(T info){ 6 this.info=info; 7 } 8 9 public static void main(String[] args) { 10 Apple<String> a1=new Apple<>("蘋果"); 11 System.out.println(a1.info); 12 Apple<Double> a2=new Apple<>(23.56); 13 System.out.println(a2.info); 14 } 15 16 }
從泛型類派生子類
?可以從帶泛型聲明的接口、類中創建其實現類或繼承類,此時使用這些接口或類時不能包含類型形參
public class A extends Apple<T>{} 此處為錯誤寫法
public class A extends Apple<String>{} 此處為正確寫法
public class A extends Apple 使用類或接口時也可以不形參傳入實參
調用方法是必須為所有的數據形參出入參數值。
不能在靜態方法、靜態變量和靜態代碼塊的聲明和初始化中使用類型參數。
public class B<T> {static T t1;public static void study(T t1){ } }
?