因爲之前已經學習過了Java泛型,具體內容在:Java核心技術 卷1 第十二章總結。
現在再補充一下泛型的內容,鞏固一下基礎知識。
泛型的概念(Generic)
- 所謂泛型,就是允許在定義類、接口時通過一個標識表示類中某個屬性的類 型或者是某個方法的返回值及參數類型。這個類型參數將在使用時(例如, 繼承或實現這個接口,用這個類型聲明變量、創建對象時)確定(即傳入實 際的類型參數,也稱爲類型實參)。
- 從JDK1.5以後,Java引入了“參數化類型(Parameterized type)”的概念, 允許我們在創建集合時再指定集合元素的類型,正如:List<String>,這表明 該List只能保存字符串類型的對象。
- JDK1.5改寫了集合框架中的全部接口和類,爲這些接口、類增加了泛型支持, 從而可以在聲明集合變量、創建集合對象時傳入類型實參。
我覺得Java泛型其實就是語法糖。使用泛型的主要優點是能夠在編譯時而不是在運行時檢測錯誤。作用如下圖所示:
Java泛型知識點:
- 泛型類可能有多個參數,此時應將多個參數一起放在尖括號內。比如: <E1,E2,E3>。
- 泛型類的構造器如下:public GenericClass(){}。 而這個是錯誤的:public GenericClass<E>(){}
- 實例化後,操作原來泛型位置的結構必須與指定的泛型類型一致。
- 泛型不同的引用不能相互賦值。
- 儘管在編譯時ArrayList<String>和ArrayList<Integer>是兩種類型,但是,在運行時只有 一個ArrayList被加載到JVM中。
- 泛型如果不指定,將被擦除,泛型對應的類型均按照Object處理,但不等價 於Object。經驗:泛型要使用一路都用。要不用,一路都不要用。
- 如果泛型結構是一個接口或抽象類,則不可創建泛型類的對象。
- jdk1.7,泛型的簡化操作:ArrayList<Fruit> flist = new ArrayList<>();
- 泛型的指定中不能使用基本數據類型,可以使用包裝類替換。
- 在類/接口上聲明的泛型,在本類或本接口中即代表某種類型,可以作爲非靜態 屬性的類型、非靜態方法的參數類型、非靜態方法的返回值類型。但在靜態方法 中不能使用類的泛型。因爲直接通過類名來調用靜態方法的時候,還不知道這個參數類型是什麼。
- 異常類不能是泛型的
- 不能使用new E[]。但是可以:E[] elements = (E[])new Object[capacity]; 參考:ArrayList源碼中聲明:Object[] elementData,而非泛型參數類型數組。
- 父類有泛型,子類可以選擇保留泛型也可以選擇指定泛型類型, 子類不保留父類的泛型:按需實現 沒有類型 擦除 具體類型 ;子類保留父類的泛型:泛型子類 全部保留 部分保留
- 方法,也可以被泛型化,不管此時定義在其中的類是不是泛型類。在泛型 方法中可以定義泛型參數,此時,參數的類型就是傳入數據的類型。
- 泛型方法的格式: [訪問權限] <泛型> 返回類型 方法名([泛型標識 參數名稱]) 拋出的異常