Java:泛型知識知多少
定義
可理解為 適配廣泛的類型,即參數化類型,可以把類型像方法的參數那樣進行傳遞。
// 以ArrayList為示例 // 泛型T可以是任意類 public class ArrayList<T> { private T[] array; //... } // 通過泛型的使用,就可創建多種類型的ArrayList // 1. 可存儲String的ArrayList: ArrayList<String> strList = new ArrayList<String>(); // 相當於 public class ArrayList<String> { private String[] array; //... } // 2. 可存儲Float的ArrayList: ArrayList<Float> floatList = new ArrayList<Float>(); // 相當於 public class ArrayList<Float> { private Float[] array; //... }
意義(即為什麼要使用泛型)
通過定義一種模板方式結構,從而保證類型安全 & 匹配。下面將用ArrayList為示例作為說明。
1. 背景
ArrayList的本質:一個可變的Object類型數組
public class ArrayList { private Object[] array; // ... }
2. 問題
在使用ArrayList存儲不同類型時,需要強轉類型,不然容易出現ClassCastException異常。如存儲String類型:
// 獲取到ArrayList裡的Object類型時,必須強制轉型為String // 不然容易出現ClassCastException異常 ArrayList list = new ArrayList(); list.add("carson ho"); String first = (String) list.get(0);
3. 解決方案
使用泛型將ArrayList變成一種模板:ArrayList,就可以創建任意類型的ArrayList。即:
// 泛型T可以是任意類 public class ArrayList<T> { private T[] array; //... } // 多種類型 // 1. 可存儲String的ArrayList: ArrayList<String> strList = new ArrayList<String>(); // 相當於 public class ArrayList<String> { private String[] array; //... } // 2. 可存儲Float的ArrayList: ArrayList<Float> floatList = new ArrayList<Float>(); // 相當於 public class ArrayList<Float> { private Float[] array; //... }
作用
1.使編譯器可在編譯期間對類型進行檢查以提高類型安全,減少運行時由於對象類型不匹配引發的異常;
2.運行時所有的轉換都是強制、隱式的,大大提高瞭代碼的重用率。如對集合類取數據時,不需 對存儲的數據 進行強制類型轉2換。
原理
基於 類型擦除。即即 使用泛型時加上的類型參數,會在編譯器在編譯時去掉所以,在生成的 Java 字節碼中,不包含泛型中的類型信息。這裡需要特別說明的是:
- Java中的泛型是在編譯器層次實現,編譯器在編譯時盡可能的發現可能出錯的地方,但仍無法避免在運行時刻出現類型轉換異常的情況;
- 在代碼中定義的List 、List等類型,在編譯後都會變成List
- JVM看到的隻是List,而由泛型附加的類型信息對JVM來說是不可見的
同時需要特別註意的是:
- 在無泛型的情況下,通常是使用Object類型來進行多種類型數據的操作,此時操作最多的是針對該Object進行數據的強制轉換
- 而這種轉換是基於開發者對該數據類型明確的情況下進行(如將Object型轉換為String型);若類型不一致,編譯器在編譯過程中不會報錯,但在運行時會出錯
額外說明: List能否轉為List?
不能。具體描述如下:
// 代碼1和代碼2相同 // 代碼1 List<String> strings = new LinkedList<String>( ); List<Integer> ints = new LinkedList<Integer>( ); // 代碼2 List strings = new LinkedList( ); List ints = new LinkedList( ); // 轉換方式可以是如下: List ss=strings; List<Object> objects=ss;
總結
本片文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!