泛型的概念
允許在定義類、介面時通過一個標識表示類中某個屬性的類 型或者是某個方法的返回值及引數型別。這個型別引數將在使用時(例如, 繼承或實現這個介面,用這個型別宣告變數、建立物件時)確定(即傳入實 際的型別引數,也稱為型別實參)。
泛型的作用
1.解決元素儲存的安全性問題,好比商品、藥品標籤,不會弄錯。
2. 解決獲取資料元素時,需要型別強制轉換的問題,好比不用每回拿商品、藥 品都要辨別。
泛型主要解決了資料儲存時型別安全和資料讀取時型別強轉。
泛型的主要優點:是能夠在編譯時而不是在執行時檢測錯誤
自定義泛型
在建立類時在類後面用<T>,<E>等代替,在例項化時指明類的泛型資料型別如<String>,<Integer>
在類名後面指定型別引數的值(型別)。
如: List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();
泛型T只能是類,不能用基本資料型別填充。但可以使用包裝類填充
泛型注意的細節:
1 泛型類可能有多個引數,此時應將多個引數一起放在尖括號內。比如: <E1,E2,E3>
2 泛型類的構造器如下:public GenericClass(){}。 而下面是錯誤的:public GenericClass()<E>{}
3.例項化後,操作原來泛型位置的結構必須與指定的泛型型別一致。
4.泛型不同的引用不能相互賦值。儘管在編譯時ArrayList和ArrayList是兩種型別,但是,在執行時只有 一個ArrayList被載入到JVM中。
5.泛型如果不指定,將被擦除,泛型對應的型別均按照Object處理,但不等價 於Object。經驗:泛型要使用一路都用。要不用,一路都不要用。
6.如果泛型結構是一個介面或抽象類,則不可建立泛型類的物件。
7 .jdk1.7,泛型的簡化操作:ArrayList flist = new ArrayList<>();
8.泛型的指定中不能使用基本資料型別,可以使用包裝類替換。
9.在類/介面上宣告的泛型,在本類或本介面中即代表某種型別,可以作為非靜態 屬性的型別、非靜態方法的引數型別、非靜態方法的返回值型別。但在靜態方法 中不能使用類的泛型。
10.異常類不能是泛型的
11.不能使用new E[]。但是可以:E[] elements = (E[])new Object[capacity]; 參考:ArrayList原始碼中宣告:Object[] elementData,而非泛型引數型別陣列。
12父類有泛型,子類可以選擇保留泛型也可以選擇指定泛型型別: