標籤:string類 成員 cat 基礎 cal eof 一個 size 變數
1、為什麼要使用泛型
這裡我們倆看一段代碼;
List list = new ArrayList(); list.add("CSDN_SEU_Cavin"); list.add(100); for (int i = 0; i < list.size(); i++) { String name = (String) list.get(i); //取出Integer時,運行時出現異常 System.out.println("name:" + name); }
本例向list類型集合中加入了一個字串類型的值和一個Integer類型的值。(這樣合法,因為此時list預設的類型為Object類型)。在之後的迴圈中,由於忘記了之前在list中也加入了Integer類型的值或其他原因,運行時會出現java.lang.ClassCastException異常。為瞭解決這個問題,泛型應運而生。
2、泛型的使用
泛型讓編程人員能夠使用類型抽象,通常用於集合裡面。
List<String> list = new ArrayList<String>();
這裡這樣寫,上面那段迴圈取值得方式就不會報錯,而且也不需要進行類型的強制轉換。通過List<String>,直接限定了list集合中只能含有String類型的元素。
3、泛型只在編譯期間有效
我們在使用泛型的時候也要瞭解到泛型的編譯時間怎樣的,因此在這裡,我們需要特別的注意是:泛型,只是在代碼編譯成class檔案期間有效
AyyayList<String> a = new ArrayList<String>(); ArrayList b = new ArrayList(); Class c1 = a.getClass(); Class c2 = b.getClass(); System.out.println(a == b);
上面程式的輸出結果為true。是因為所有反射的操作都是在運行時進行的,既然為true,就證明了編譯之後,程式會採取去泛型化的措施。
也就是說Java中的泛型,只在編譯階段有效。在編譯過程中,正確檢驗泛型結果後,會將泛型的相關資訊擦出,並且在對象進入和離開方法的邊界處添加類型檢查和類型轉換的方法。也就是說,成功編譯過後的class檔案中是不包含任何泛型資訊的。泛型資訊不會進入到運行時階段。
下面這段代碼通過Java的反射機制很好的解釋了泛型只在編譯期間有效
ArrayList<String> a = new ArrayList<String>(); a.add("CSDN_SEU_Cavin"); Class c = a.getClass(); try{ Method method = c.getMethod("add",Object.class); method.invoke(a,100); System.out.println(a); //[CSDN_SEU_Cavin, 100]
}catch(Exception e){
e.printStackTrace();
}
4、泛型類和泛型方法
public static class FX<T> { private T ob; // 定義泛型成員變數 public FX(T ob) { this.ob = ob; } public T getOb() { return ob; } public void showTyep() { System.out.println("T的實際類型是: " + ob.getClass().getName()); } } public static void main(String[] args) { FX<Integer> intOb = new FX<Integer>(100); intOb.showTyep(); System.out.println("value= " + intOb.getOb()); //java.lang.Integer System.out.println("----------------------------------"); FX<String> strOb = new FX<String>("CSDN_SEU_Calvin"); strOb.showTyep(); System.out.println("value= " + strOb.getOb()); //value= 100 }
5.泛型的好處
(1)型別安全。
通過知道使用泛型定義的變數的類型限制,編譯器可以更有效地提高Java程式的型別安全。
(2)消除強制類型轉換。
消除原始碼中的許多強制類型轉換。這使得代碼更加可讀,並且減少了出錯機會。所有的強制轉換都是自動和隱式的。
(3)提高效能
6.泛型使用的注意事項
(1)泛型的型別參數只能是類類型(包括自訂類),不能是簡單類型。
(2)泛型的型別參數可以有多個。
(3)不能對確切的泛型型別使用instanceof操作。如下面的操作是非法的,編譯時間會出錯。
(4)不能建立一個確切的泛型型別的數組。
Java基礎之Java中的泛型