Java泛型
背景
對(duì)java的泛型特性的了解僅限于表面的淺淺一層,直到在學(xué)習(xí)設(shè)計(jì)模式時(shí)發(fā)現(xiàn)有不了解的用法,才想起詳細(xì)的記錄一下。
本文參考java 泛型詳解、Java中的泛型方法、 java泛型詳解
學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://www.bilibili.com/video/BV1Np4y1t7es
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV11541137LX
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV1F54y177YZ
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV12A411x7pr
一些相關(guān)書籍文檔我都有整理,可以無償分享給大家,點(diǎn)擊鏈接進(jìn)群就可以啦!
5本Java 泛型相關(guān)學(xué)習(xí)書籍
22本Java架構(gòu)師核心書籍
從0到1Java學(xué)習(xí)路線和資料
1000+道2021年最新面試題
1. 概述
泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計(jì)模式中有非常廣泛的應(yīng)用。
什么是泛型?為什么要使用泛型?
泛型,即“參數(shù)化類型”。一提到參數(shù),最熟悉的就是定義方法時(shí)有形參,然后調(diào)用此方法時(shí)傳遞實(shí)參。那么參數(shù)化類型怎么理解呢?
學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://www.bilibili.com/video/BV1Np4y1t7es
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV11541137LX
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV1F54y177YZ
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV12A411x7pr
顧名思義,就是將類型由原來的具體的類型參數(shù)化,類似于方法中的變量參數(shù),此時(shí)類型也定義成參數(shù)形式(可以稱之為類型形參),
然后在使用/調(diào)用時(shí)傳入具體的類型(類型實(shí)參)。
泛型的本質(zhì)是為了參數(shù)化類型(在不創(chuàng)建新的類型的情況下,通過泛型指定的不同類型來控制形參具體限制的類型)。也就是說在泛型使用過程中,
操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù),這種參數(shù)類型可以用在類、接口和方法中,分別被稱為泛型類、泛型接口、泛型方法。
2. 一個(gè)栗子
一個(gè)被舉了無數(shù)次的例子:

ArrayList可以存放任意類型,例子中添加了一個(gè)String類型,添加了一個(gè)Integer類型,再使用時(shí)都以String的方式使用,因此程序崩潰了。為了解決類似這樣的問題(在編譯階段就可以解決),泛型應(yīng)運(yùn)而生。
學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://www.bilibili.com/video/BV1Np4y1t7es
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV11541137LX
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV1F54y177YZ
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV12A411x7pr
我們將第一行聲明初始化list的代碼更改一下,編譯器會(huì)在編譯階段就能夠幫我們發(fā)現(xiàn)類似這樣的問題。

輸出結(jié)果:D/泛型測(cè)試: 類型相同
。
通過上面的例子可以證明,在編譯之后程序會(huì)采取去泛型化的措施。也就是說Java中的泛型,只在編譯階段有效。在編譯過程中,正確檢驗(yàn)泛型結(jié)果后,會(huì)將泛型的相關(guān)信息擦出,并且在對(duì)象進(jìn)入和離開方法的邊界處添加類型檢查和類型轉(zhuǎn)換的方法。也就是說,泛型信息不會(huì)進(jìn)入到運(yùn)行時(shí)階段。
學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://www.bilibili.com/video/BV1Np4y1t7es
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV11541137LX
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV1F54y177YZ
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV12A411x7pr
對(duì)此總結(jié)成一句話:泛型類型在邏輯上看以看成是多個(gè)不同的類型,實(shí)際上都是相同的基本類型。
4. 泛型的使用
泛型有三種使用方式,分別為:泛型類、泛型接口、泛型方法
4.3 泛型類
泛型類型用于類的定義中,被稱為泛型類。通過泛型可以完成對(duì)一組類的操作對(duì)外開放相同的接口。最典型的就是各種容器類,如:List、Set、Map。
泛型類的最基本寫法(這么看可能會(huì)有點(diǎn)暈,會(huì)在下面的例子中詳解):


定義的泛型類,就一定要傳入泛型類型實(shí)參么?并不是這樣,在使用泛型的時(shí)候如果傳入泛型實(shí)參,則會(huì)根據(jù)傳入的泛型實(shí)參做相應(yīng)的限制,此時(shí)泛型才會(huì)起到本應(yīng)起到的限制作用。如果不傳入泛型類型實(shí)參的話,在泛型類中使用泛型的方法或成員變量定義的類型可以為任何的類型。
學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://www.bilibili.com/video/BV1Np4y1t7es
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV11541137LX
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV1F54y177YZ
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://www.bilibili.com/video/BV12A411x7pr
作者:Java干貨鋪
鏈接:https://juejin.cn/post/6960913691990556680
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。