? ? ? ?最課程師徒班的同學正在紅紅火火的學習中。仿佛大咱、應該恬涧、必須,到了跟大家階段性匯報成果的時候了碴巾。為什么溯捆,因為畢竟當時把師徒班說的那么好,就業(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