學員優(yōu)秀博文賞析:泛型通配符及約束

? ? ? ?最課程師徒班的同學正在紅紅火火的學習中。仿佛大咱、應該恬涧、必須,到了跟大家階段性匯報成果的時候了碴巾。為什么溯捆,因為畢竟當時把師徒班說的那么好,就業(yè)班的同學該要鬧革命了餐抢。


? ? ? ?師徒班相較于就業(yè)班现使,雖然課程內(nèi)容和總量完全一樣低匙,但學員的學習過程掌握了更多的主動性。而檢驗主動性一個重要的標準碳锈,除了日常的作業(yè)和任務顽冶,就是學員們的博客了。我們要求學員必須每周一篇博文售碳∏恐兀可以說,看學員博客的過程贸人,就可以知道大家的成長有多么大了间景。

? ? ? ?說的這么好,來艺智,給看看唄倘要。

? ? ? ?好滴。我們以后會陸續(xù)放出學員的優(yōu)秀博客十拣》馀。看部分同學的博客,我都要怕怕了夭问,怕很快我都要教不了他們了泽西。長江后浪推前浪,一浪更比一浪浪~~~

? ? ? ?那么好缰趋,開篇是誰捧杉?開篇難道不應該選一位極具geek氣息的同學(diaosi)嗎?到底是geek還是diaosi秘血,你們來評判:


? ? ? ?哦味抖,不不,帥氣就要露出來直撤,怎能徒留背多芬:


? ? ? ?我們劉同學的這篇博客名為:《對Java通配符的個人理解(以集合為例)》非竿。可以說谋竖,初學者能將泛型通配符及約定理解到這種程度是很不容易的红柱。不信,你去看看身邊的開發(fā)者蓖乘,關于這塊的概念锤悄,多數(shù)工作了多年的開發(fā)者可能都沒我們的小劉同學理解的深刻。并且嘉抒,劉同學一開始就不滿足僅限于日常體系的學習零聚,很早就去關注了一些優(yōu)秀的編程資源,比如阿里的編碼規(guī)范(本文中也有體現(xiàn)的)。

? ? ? ?咳咳隶症,就業(yè)班的同學們政模,我馬上就要把師徒班的若干成功經(jīng)驗應用到你們的頭上來了哦。當然蚂会,這也意味著你們將會犧牲更多的休息時間來完成作業(yè)和任務淋样。不過,為了拿薪水更高的offer胁住,一切都是值得的趁猴。

? ? ? ?華麗的分割線,以下是劉同學博客原文:


================================================================

Java通配符的個人理解(以集合為例)

前言

最近在學習Java彪见,當學到了泛型的通配符時儡司,不是很理解PECS(Producer Extends Consumer Super)原則,以及 不能使用add方法和 不能使用get方法(注意:僅能使用Object o = list.get(0);取得是Object對象)余指,所以我對它進行了學習和理解捕犬,這篇博文用了簡單通俗的方法去講解add和get在通配符中的使用場景以及PECS原則〗途担可能本人的水平有限或听,如果我的理解有誤或者內(nèi)容錯誤,歡迎指出來笋婿,我好進行及時修改。


一顿颅、什么是泛型通配符

<一>簡單定義泛型統(tǒng)配符

1. 在了解泛型的統(tǒng)配符之前缸濒,我們先了解下什么是泛型,泛型是一種包含類型參數(shù)的類粱腻,值得注意的一點是這里的類型必須是引用數(shù)據(jù)類型庇配,而且放在尖括號< >內(nèi),這里引進了類型參數(shù)绍些,將類直接作為了參數(shù)捞慌。


2. 那么是什么泛型統(tǒng)配符呢,我沒有找到定義柬批,所以我自己給它下了個定義啸澡。泛型通配符是在泛型的使用中,用來表示對泛型類型進行類型范圍限定的特殊符號氮帐。這里用通配符就是為了表明要輸入的類型要在一定范圍之內(nèi)嗅虏,說的通俗一些其實就是一個類型取值范圍,而最大值是Object這是確定的上沐。


<二>泛型通配符的分類

1. :無限通配符皮服,可以在?中放入里放入任何引用數(shù)據(jù)類型,用來接收任意引用數(shù)據(jù)類型。


2. :這個表明的是通配符的上界龄广,通俗講就如同取值范圍中的負無窮到E硫眯,即小于等于E的所有類型, 因為E是最大的類型(最大可以達到Object)择同,表明可以輸入所有的E的子類和E两入,等下會進行細致的講解。


3. :這個表明的是通配符的下界奠衔,通俗講其取值范圍就是E到最大值Object(因為Object是所有類的基類)谆刨,就是大于等于E,小于等于Object類。


注意:這里能制定上界或者下界归斤,但是不能同時制定痊夭,然后中的extends不一定表示類與類的繼承還可以表示實現(xiàn)的關系,然后通配符一般是用在方法的形參聲明和方法調(diào)用上脏里,無法用于定義類和接口中她我。


二、泛型通配符講解

?<一>通配符的使用以及代碼演示

1.無限通配符的使用:可以傳入任何引用數(shù)據(jù)類型

A 在調(diào)用方法時使用迫横?通配符的過程中無法使用add方法番舆。

原因分析:因為通配符?代表任意的數(shù)據(jù)類型,但是當我們調(diào)用的時候或者用在方法的聲明上矾踱,其實這個時候還是沒有給恨狈?通配符一個指定的引用數(shù)據(jù)類型,那么Java出于安全起見呛讲,就不可能允許添加元素禾怠。


B 以上的add方法雖然無法調(diào)用,add是例外贝搁。

原因分析:因為null可以給任意引用數(shù)據(jù)類型賦值吗氏,代表任意引用數(shù)據(jù),但是很容易引起NullPointerException雷逆。


C 注意使用List和List當作形參時的作用不能等同,比如當傳入List時List可以接收弦讽,但是List無法接收。

原因分析:因為膀哲?代表任何參數(shù)類型可以接收往产,但是List中雖然Object是所有子類的父類,但是List不是List的父類等太,List是ArrayList等類的父類捂齐,這就是為什么泛型前后要一致的原因,從數(shù)組的角度去理解集合就比如Object[ ] arr不是Integer[ ] arr1的父類缩抡。


2.上界通配符的使用:可以傳入E和E的子類

A 作為形參時例如List可以使用集合的get方法來獲取E或者E類型本身的元素奠宜。

原因分析:當我們用get方法時我們其實是在獲取集合里內(nèi)部的元素包颁,但是我們的集合的數(shù)據(jù)類型還沒有確定,但是我們可以獲得一些明確的已知條件压真,那就是在中最大的類型是E娩嚼,而且這個E最大是Object,所以我們可以利用這一點滴肿,那么我們就可以清楚地了解到該集合里面的獲取的元素肯定是E或者Object的子類岳悟,他們的范圍肯定小于E或者Object,那么我們就可以用Object和E這兩個范圍比集合里面的元素大的類去接收集合里面的元素泼差。(注:可能略顯啰嗦但是我就是想解釋清楚贵少。)


B 在使用上界通配符時,無法調(diào)用add方法來添加非null的元素堆缘。

原因分析:由于上面已經(jīng)說得很清楚了滔灶,作為形參時例如List這時最大類型是E和Object,但是我們不清楚最小的類型是什么,因為此時?這個通配符沒有被賦值吼肥,我們調(diào)用add方法是要添加集合元素或者集合元素的子類录平,但是我們沒法明確肯定該集合元素類型,或者比該集合元素范圍更小的子類缀皱,那么Java就不會允許添加元素斗这。


3.下界通配符的使用:可以傳入E或者E的父類

A 在使用下界通配符時,無法使用get方法獲取Object以外的元素,或者需要向下轉型啤斗,但是可能出現(xiàn)ClassCastException的異常表箭。

原因分析:上界通配符,在使用get方法的時候钮莲,此時類型沒有明確還是問號燃逻?我們只能明確其最大父類或者接口時,我們才能接收臂痕,但是我們只能明白作為形參時例如List時,只能明確Object是最大父類猿涨,其他的一概不知握童,所以只能Object o = list.get(0)。


B 可以使用集合的add方法添加E或者E的子類叛赚。

原因分析:上界通配符已經(jīng)解釋很清楚了澡绩,add方法添加元素時,俺附?類型不確定就要明確該肥卡?類型的最小子類,只要比可能存在的最小子類或者子接口小的任意引用數(shù)據(jù)類型的對象事镣,我們都可以將其添加步鉴,而下界通配符當作形參時例如List,此時E就是最小子類,此時add方法可以添加E或者E的父類或者接口氛琢。


<二>對PECS原則的解讀

1.什么是PECS原則喊递?

PECS是Producer Extends Consumer Super的遞歸縮寫,是Java中使用泛型通配符的原則阳似。


2.阿里巴巴的通配符使用規(guī)約

泛型通配符來接收返回的數(shù)據(jù)骚勘,此寫法的泛型集合不能使用 add 方法,而 < ? super T> 不能使用 get 方法撮奏,做為接口調(diào)用賦值時易出錯俏讹。

說明:擴展說一下PECS 原則:第一、頻繁往外讀取內(nèi)容的畜吊,適合用泽疆。第二、經(jīng)常往里插入的定拟,適合用 于微。


3.對PECS原則的簡單解讀

字面意思是生產(chǎn)者要被繼承要被當作上界通配符的上界E,消費者要繼承其他類要被當成下界通配符的下界E青自,再借助下阿里巴巴的泛型開發(fā)規(guī)約去理解下株依,應該就是當這個被傳入的類型需要進行很多get操作獲取數(shù)據(jù)的話,那么請使用上界通配符這時這個上界就如同生產(chǎn)者一樣延窜,因為它能被不斷get到恋腕,而當需要不斷進行add方法添加數(shù)據(jù)的話,請使用下界通配符這時這個下界就如同消費者一樣逆瑞,因為它不斷地索取荠藤,因為我們在不斷地add元素給它。

再一次的分割線

===================================================================

1:劉同學的原文博客在:http://www.cnblogs.com/JNovice/

2:師徒班持續(xù)招生中获高,想成為像劉同學一樣的優(yōu)秀學員哈肖,請來這里報名:http://www.zuikc.com

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市念秧,隨后出現(xiàn)的幾起案子淤井,更是在濱河造成了極大的恐慌,老刑警劉巖摊趾,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爷怀,死亡現(xiàn)場離奇詭異煌恢,居然都是意外死亡跺讯,警方通過查閱死者的電腦和手機拴泌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肛炮,“玉大人止吐,你說我怎么就攤上這事宝踪。” “怎么了祟印?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵肴沫,是天一觀的道長。 經(jīng)常有香客問我蕴忆,道長颤芬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任套鹅,我火速辦了婚禮站蝠,結果婚禮上,老公的妹妹穿的比我還像新娘卓鹿。我一直安慰自己菱魔,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布吟孙。 她就那樣靜靜地躺著澜倦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杰妓。 梳的紋絲不亂的頭發(fā)上藻治,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音巷挥,去河邊找鬼桩卵。 笑死,一個胖子當著我的面吹牛倍宾,可吹牛的內(nèi)容都是我干的雏节。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼高职,長吁一口氣:“原來是場噩夢啊……” “哼钩乍!你這毒婦竟也來了?” 一聲冷哼從身側響起怔锌,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤件蚕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后产禾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡牵啦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年亚情,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哈雏。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡楞件,死狀恐怖衫生,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情土浸,我是刑警寧澤罪针,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站黄伊,受9級特大地震影響泪酱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜还最,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一墓阀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拓轻,春花似錦斯撮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枣氧,卻和暖如春溢十,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背作瞄。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工茶宵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宗挥。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓乌庶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親契耿。 傳聞我的和親對象是個殘疾皇子瞒大,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353