Java泛型的查漏補缺

因爲之前已經學習過了Java泛型,具體內容在:Java核心技術 卷1 第十二章總結。

現在再補充一下泛型的內容,鞏固一下基礎知識。

泛型的概念(Generic)

  • 所謂泛型,就是允許在定義類、接口時通過一個標識表示類中某個屬性的類 型或者是某個方法的返回值及參數類型。這個類型參數將在使用時(例如, 繼承或實現這個接口,用這個類型聲明變量、創建對象時)確定(即傳入實 際的類型參數,也稱爲類型實參)。
  • 從JDK1.5以後,Java引入了“參數化類型(Parameterized type)”的概念, 允許我們在創建集合時再指定集合元素的類型,正如:List<String>,這表明 該List只能保存字符串類型的對象。 
  •  JDK1.5改寫了集合框架中的全部接口和類,爲這些接口、類增加了泛型支持, 從而可以在聲明集合變量、創建集合對象時傳入類型實參。
     

  我覺得Java泛型其實就是語法糖。使用泛型的主要優點是能夠在編譯時而不是在運行時檢測錯誤。作用如下圖所示: 

 

 

 

 Java泛型知識點:

  1.  泛型類可能有多個參數,此時應將多個參數一起放在尖括號內。比如: <E1,E2,E3>。
  2.  泛型類的構造器如下:public GenericClass(){}。 而這個是錯誤的:public GenericClass<E>(){}  
  3. 實例化後,操作原來泛型位置的結構必須與指定的泛型類型一致。 
  4. 泛型不同的引用不能相互賦值。 
  5. 儘管在編譯時ArrayList<String>和ArrayList<Integer>是兩種類型,但是,在運行時只有 一個ArrayList被加載到JVM中。 
  6. 泛型如果不指定,將被擦除,泛型對應的類型均按照Object處理,但不等價 於Object。經驗:泛型要使用一路都用。要不用,一路都不要用。 
  7. 如果泛型結構是一個接口或抽象類,則不可創建泛型類的對象。 
  8.  jdk1.7,泛型的簡化操作:ArrayList<Fruit> flist = new ArrayList<>(); 
  9.  泛型的指定中不能使用基本數據類型,可以使用包裝類替換。
  10. 在類/接口上聲明的泛型,在本類或本接口中即代表某種類型,可以作爲非靜態 屬性的類型、非靜態方法的參數類型、非靜態方法的返回值類型。但在靜態方法 中不能使用類的泛型。因爲直接通過類名來調用靜態方法的時候,還不知道這個參數類型是什麼。 
  11. 異常類不能是泛型的  
  12. 不能使用new E[]。但是可以:E[] elements = (E[])new Object[capacity]; 參考:ArrayList源碼中聲明:Object[] elementData,而非泛型參數類型數組。  
  13. 父類有泛型,子類可以選擇保留泛型也可以選擇指定泛型類型, 子類不保留父類的泛型:按需實現  沒有類型 擦除  具體類型  ;子類保留父類的泛型:泛型子類  全部保留  部分保留  
  14. 方法,也可以被泛型化,不管此時定義在其中的類是不是泛型類。在泛型 方法中可以定義泛型參數,此時,參數的類型就是傳入數據的類型。 
  15.  泛型方法的格式: [訪問權限] <泛型> 返回類型 方法名([泛型標識 參數名稱]) 拋出的異常 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章