Java 中的泛型 (Generic)

泛型 (Generic)

泛型 (Generic)募闲,即“參數(shù)化類型”俘陷,就是允許在定義類罗捎、接口、方法時使用類型形參拉盾,這個類型形參將在使用時(聲明變量桨菜、創(chuàng)建對象、調(diào)用方法)傳入實際的類型參數(shù)(類型實參)捉偏。

好處

泛型的好處是在編譯的時候檢查類型安全倒得,并且所有的強(qiáng)制轉(zhuǎn)換都是自動和隱式的,可以提高代碼的重用率夭禽。

規(guī)則

1. 使用簡練的名字作為類型形參的名字霞掺,最好為單個的大寫字母,比如 T 讹躯;
2. 如果一個泛型類有泛型方法菩彬,對于它們的類型形參來說缠劝,應(yīng)避免使用相同的名字;
3. 泛型的類型實參只能是類類型骗灶,不能是基本數(shù)據(jù)類型惨恭。

“菱形”語法

在 Java 7 之前,如果使用帶泛型的接口耙旦、類定義變量時脱羡,調(diào)用構(gòu)造器創(chuàng)建對象時,構(gòu)造器后面必須帶泛型免都,如: List<String> list = new ArrayList<String>();
而從 Java 7 開始锉罐,Java 允許在構(gòu)造器后面不帶完整的泛型信息,只需給出一對尖括號即可<>琴昆,如:List<String> list = new ArrayList<>();

定義泛型類

具體例子:

Person - class

上面定義了一個帶泛型聲明的 Person<T> 類氓鄙,其有一個形式參數(shù)為泛型的構(gòu)造器和一個返回值類型為泛型的 getInfo() 方法,使用 Person<T> 類時就可以為 T 類型形參傳入實際的類型參數(shù)业舍。

運(yùn)行結(jié)果:

Result

結(jié)果分析:

第27行代碼的返回結(jié)果為 true,這是因為不管為泛型的類型形參傳入什么類型實參升酣,它們依然被當(dāng)成同一個類處理舷暮,在內(nèi)存中也只占一塊內(nèi)存空間。因此噩茄,在靜態(tài)變量下面、靜態(tài)方法、靜態(tài)初始化塊的聲明和初始化中均不能使用類型形參绩聘。另外沥割,instanceof 運(yùn)算符后也不能使用泛型類。

定義泛型接口

定義泛型接口與定義泛型類道理相同凿菩。

定義泛型方法 (Generic Method)

1. 泛型方法机杜,即在聲明方法時定義一個或多個類型形參;
2. 語法格式為:
    修飾符 <T, S> 返回值類型 方法名 (參數(shù)列表) {}
3. 泛型方法中定義的類型形參只能在該方法里使用衅谷。

類型通配符

1. 類型通配符是一個問號 ? 椒拗, 將問號作為類型實參傳給泛型類或泛型接口,如:List<?> (意思是元素類型未知的 List)
2. 在 Java 的集合框架中获黔,對于參數(shù)值是未知類型的容器類蚀苛,只能讀取其中元素,不能向其中添加元素玷氏,因為編譯器無法確定添加的元素的類型和集合中的類型是否兼容堵未,但 null 例外,因為它是所有引用類型的實例盏触。

設(shè)定類型通配符的上限

1. 當(dāng)使用 List<?> 這種形式時渗蟹,表明這個 List 集合可以是任何泛型 List 的父類块饺,如果我們只希望這個 List 集合代表某一類型的父類,可以考慮設(shè)定類型通配符的上限拙徽。
2. 設(shè)定類型通配符上限的格式為:List<? extends Xxxx>
    注:Xxxx表示一個類刨沦,此處的 ? 表示未知類型,但是此處的未知類型一定是 Xxxx 的子類或它本身膘怕,Xxxx 稱為這個通配符的上限(upper bound).
3. 由于編譯器無法確定這個受限制的通配符的具體類型想诅,所以不能把 Xxxx 對象及其子類的對象加入到這個泛型集合中,只能讀取岛心。

設(shè)定類型通配符的下限

設(shè)定類型通配符上限的格式為:List<? super Xxxx>
    注:Xxxx表示一個類来破,此處的 ? 表示未知類型,但是此處的未知類型一定是 Xxxx 的父類或它本身忘古,Xxxx 稱為這個通配符的下限(lower bound).

設(shè)定類型形參的上限

1. 同設(shè)定類型通配符的上限一樣徘禁,Java運(yùn)行設(shè)定類型形參的上限,用于表示傳給該類型形參的實際類型是該上限類型或其子類髓堪,如:
    public void drawAll(List<? extends Shape> shapes){}
    注:問號 ? 表示 Shape 的未知子類送朱,編譯器無法確定這個類型是什么,所以無法把任何對象添加到這種集合中
2. 當(dāng)為需要類型形參設(shè)定多個上限時干旁,類上限必須位于第一位驶沼,并且最多只有一個,而接口上限數(shù)量則沒有限制争群,如:
    public class Student<? extends Person & Serializable>{}

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末回怜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子换薄,更是在濱河造成了極大的恐慌玉雾,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轻要,死亡現(xiàn)場離奇詭異复旬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)伦腐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門赢底,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柏蘑,你說我怎么就攤上這事幸冻。” “怎么了咳焚?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵洽损,是天一觀的道長。 經(jīng)常有香客問我革半,道長碑定,這世上最難降的妖魔是什么流码? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮延刘,結(jié)果婚禮上漫试,老公的妹妹穿的比我還像新娘。我一直安慰自己碘赖,他們只是感情好驾荣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著普泡,像睡著了一般播掷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撼班,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天歧匈,我揣著相機(jī)與錄音,去河邊找鬼砰嘁。 笑死件炉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的矮湘。 我是一名探鬼主播妻率,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼板祝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起走净,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤券时,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伏伯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橘洞,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年说搅,在試婚紗的時候發(fā)現(xiàn)自己被綠了炸枣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡弄唧,死狀恐怖适肠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情候引,我是刑警寧澤侯养,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站澄干,受9級特大地震影響逛揩,放射性物質(zhì)發(fā)生泄漏柠傍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一辩稽、第九天 我趴在偏房一處隱蔽的房頂上張望惧笛。 院中可真熱鬧,春花似錦逞泄、人聲如沸患整。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽并级。三九已至,卻和暖如春侮腹,著一層夾襖步出監(jiān)牢的瞬間嘲碧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工父阻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愈涩,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓加矛,卻偏偏與公主長得像履婉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斟览,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 本文包括:JDK5之前集合對象使用問題泛型的出現(xiàn)泛型應(yīng)用泛型典型應(yīng)用自定義泛型——泛型方法自定義泛型——泛型類泛型...
    廖少少閱讀 1,905評論 5 16
  • 一毁腿、泛型簡介1.引入泛型的目的 了解引入泛型的動機(jī),就先從語法糖開始了解苛茂。 語法糖 語法糖(Syntactic S...
    Android進(jìn)階與總結(jié)閱讀 1,029評論 0 9
  • 一已烤、泛型簡介 1.引入泛型的目的 了解引入泛型的動機(jī),就先從語法糖開始了解妓羊。 語法糖 語法糖(Syntactic ...
    Ruheng閱讀 4,531評論 2 50
  • 開發(fā)人員在使用泛型的時候胯究,很容易根據(jù)自己的直覺而犯一些錯誤。比如一個方法如果接收List作為形式參數(shù)躁绸,那么如果嘗試...
    時待吾閱讀 1,057評論 0 3
  • 時間越接近于見面的時間裕循,我就越發(fā)的想你,而且就著想你的余熱净刮,我開始更多的喜歡和改善自己剥哑,焦點(diǎn)解決會說,在與咨詢師預(yù)...
    木木的心心閱讀 165評論 0 0