1. 程式人生 > 其它 >Java -- > 泛型深入

Java -- > 泛型深入

 

感受泛型的優點:

  • 1、 紅色框內的就是泛型,說的直白一點,上邊的泛型就是集合的資料型別,它可以約束集合,因為Java作為一種強型別的語言,它希望在對資料操作之前就知道改資料屬於何種型別,便於後續對這些資料的操作。比如,我們平時很少會去使用所有資料型別的父類:Object去定義一個變數或者集合,而是去使用具體的資料型別如int、Integer,double、Double等等~~~

  • 2、我們可以看到,如果不使用泛型,集合內可以新增任意型別的元素,如果我們後續遍歷這個集合的話,或者對著個集合進行其他強制型別轉換等其他操作的話,我們無法確定用何種資料型別進行強制型別轉換。

  •  模擬ArrayList集合自定義一個集合MyArrayLIst集合,完成新增和刪除功能的泛型設計即可。

 

  •  泛型方法:例 --> 模擬實現Arrays.toString()方法,實現傳入任意型別的陣列都能列印陣列的內容:

 示例執行結果:

  •  泛型介面導學:教務系統,提供一個介面可約束一定要完成資料的增刪改查操作:

 學生類:

 老師類:

 這樣,通過實現類約束具體型別資料的操作

  • 泛型萬用字元:案例導學-->開發一個極品飛車的遊戲,所有的汽車都能一起參與比賽

 對此,或許我們的第一反應是將泛型型別改為Car型別:

 但是你會發現,Car型別的集合會導致任意型別Car子類型別的所有車型都無法進入比賽,理論上來說不應這樣,因為我們知道:父類裡邊定義的是所有子類共有的特徵,那為什麼還有導致這樣的現象呢?這裡值得一提的一點是:雖然BWM和BENZ都繼承了Car,但是ArrayList<BWM>和ArrayList<BENZ>與ArrayList<Car>是沒有關係的

,說的直白一點:類是類,集合是集合,類有繼承關係但集合沒有。

 解決方法:萬用字元-->

 所謂萬用字元:就是在使用集合的時候可以代表一切資料型別。

可是,這也會帶來問題:由於?表示可以代表一切資料型別,那麼集合中就可以新增任意型別的資料,這會使得集合內部的資料型別過於雜亂,比如:我們可以在定義一個Cat類,則建立的Cat類物件也可以進入這個集合中去:

 這不亂套了?解決方法:使用上下限,此處用的上限:? extends Car:?必須是Car或者其子類;下限表示:? super Car:必須是Car或者其父類  (實際開發中泛型下限使用較少):

這樣,通過使用 萬用字元+泛型上限 ,使得泛型作為方法的引數型別即增加了靈活性又不失約束。