JAVA 泛型理解

一直對(duì)java泛型一知半解,決定好好理解一下泛型.


泛型的基本使用:

我們最常用到泛型的地方可能是arraylist中官扣,如:ArrayList<Integer> intList = new ArrayList<Integer>();它可以構(gòu)造各種類(lèi)型的變量來(lái)組裝成不同的list而不必對(duì)每一個(gè)類(lèi)型都創(chuàng)建一個(gè)Arraylist的類(lèi),

  • 定義及使用:
//定義
class Person<T>{// 此處可以隨便寫(xiě)標(biāo)識(shí)符號(hào)   
    private T x ;        
    private T y ;        
    public void setAge(T x){//作為參數(shù)  
        this.x = x ;  
    }  
    public void setName(T y){  
        this.y = y ;  
    }  
    public T getAge(){//作為返回值  
        return this.x ;  
    }  
    public T getName(){  
        return this.y ;  
    }  
};

因?yàn)門(mén)表示派生自O(shè)bject類(lèi)的任何類(lèi),所以尖括號(hào)T中必須是繼承自O(shè)bject,如:String,Interger,不能使用原始的類(lèi)型,如int,double.

//使用
//設(shè)置年齡 
Person<Integer> p = new Person<Integer>() ;   
p.setAge(new Integer(100)) ;   
System.out.println(p.getAge());   
//設(shè)置名字  
Person<String> p = new Person<String>() ;   
p.setName(new String("name")) ;   
System.out.println(p.getName()); 

使用的Class<T> object來(lái)傳遞類(lèi)的class對(duì)象

我們?cè)诮馕鯦son的時(shí)候:

public static List<SuccessModel> parseSuccessArray(String response){  
    List<SuccessModel> modelList = JSON.parseArray(response, SuccessModel.class);  
    return modelList;  
}  

這樣做比較的死板芙委,我們可以吧successmodel抽取出來(lái)逞敷,當(dāng)做一個(gè)變量,這樣就可以使用到泛型了灌侣,如下:

public static <T> List<T> parseArray(String response,Class<T> object){  
    List<T> modelList = JSON.parseArray(response, object);  
    return modelList;  
}  

注意到推捐,我們用的Class<T> object來(lái)傳遞類(lèi)的class對(duì)象,即我們上面提到的SuccessModel.class侧啼,這樣就可以傳遞任意的class來(lái)解析不同的數(shù)據(jù).

//待續(xù)牛柒。。痊乾。皮壁。

進(jìn)階

類(lèi)型綁定:

有時(shí)候定義泛型的時(shí)候可能希望泛型類(lèi)型只能是一部分類(lèi)型,就是給泛型指定一個(gè)界限,
定義形式為:

<T extends BoundingType>  

T和BoundingType可以是類(lèi)哪审,也可以是接口闪彼。另外注意的是,此處的”extends“表示的子類(lèi)型协饲,不等同于繼承。在這里extends后的BoundingType可以是類(lèi)缴川,也可以是接口.

通配符:

通配符用?表示無(wú)邊界通配符茉稠,通配符的意義就是他是一個(gè)未知的符號(hào),可以表示任意的類(lèi)把夸,如:

Point<?> point;  
point = new Point<Integer>(3,3);  
point = new Point<Float>(4.3f,4.3f);  
point = new Point<Double>(4.3d,4.90d);  
point = new Point<Long>(12l,23l); 
  • 通配符?和T的區(qū)別:
    泛型變量T不能在代碼用于創(chuàng)建變量而线,只能在類(lèi),接口恋日,函數(shù)中聲明以后膀篮,才能使用。
    而無(wú)邊界通配符岂膳?則只能用于填充泛型變量T誓竿,表示通配任何類(lèi)型
    如:
Box<?> box;  
box = new Box<String>(); 

?只能出現(xiàn)在Box<?> box;中谈截,其它位置都是不對(duì)的

  • 通配符?的extends綁定:
    通配符可以和泛型一樣加以限定筷屡。如:
Point<? extends Number> point;

注意:利用<? extends Number>定義的變量,只可取其中的值簸喂,不可修改
如:

Point<? extends Number> point = new Point<Integer>(3);

point的類(lèi)型是由Point<? extends Number>決定的,并不會(huì)因?yàn)閜oint = new Point<Integer>(3);而改變類(lèi)型毙死。如果會(huì)改變類(lèi)型那么<? extends Number>就失去了作用。但取值時(shí)喻鳄,正由于泛型變量T被填充為<? extends Number>扼倘,所以編譯器能確定的是T肯定是Number的子類(lèi),編譯器就會(huì)用Number來(lái)填充T除呵。

通配符再菊?的super綁定:

如果說(shuō) <? extends XXX>指填充為派生于XXX的任意子類(lèi)的話(huà)爪喘,那么<? super XXX>則表示填充為任意XXX的父類(lèi).
如:

class CEO extends Manager {  
}  
  
class Manager extends Employee {  
}  
  
class Employee {  
}  

List<? super Manager> list;  
list = new ArrayList<Employee >();
list = new ArrayList<Manager >();
list = new ArrayList<CEO >();//編譯會(huì)報(bào)錯(cuò)

因?yàn)镃EO類(lèi)已經(jīng)不再是Manager的父類(lèi)了。所以會(huì)報(bào)編譯錯(cuò)誤袄简。
注意:super通配符表示的實(shí)例內(nèi)容:能存不能取
先看存的部分:

List<? super Manager> list;  
list = new ArrayList<Employee>();  
//存  
list.add(new Employee()); //編譯錯(cuò)誤  
list.add(new Manager());  
list.add(new CEO()); 

為什么會(huì)報(bào)編譯錯(cuò)誤呢?因?yàn)?br> 編譯器無(wú)法確定<? super Manager>的具體類(lèi)型腥放,但唯一可以確定的是Manager()、CEO()肯定是<? super Manager>的子類(lèi)绿语,所以肯定是可以add進(jìn)去的秃症。但Employee不一定是<? super Manager>的子類(lèi),所以不能確定吕粹,不能確定的种柑,肯定是不允許的,所以會(huì)報(bào)編譯錯(cuò)誤匹耕。
super和extends相反聚请,使用super關(guān)鍵字時(shí),往里存的只要是Employee的子類(lèi),就會(huì)強(qiáng)制轉(zhuǎn)換為Employee存儲(chǔ),但是取出來(lái)時(shí)應(yīng)該都為父類(lèi)Employee所以沒(méi)有意義稳其,所以我們認(rèn)為super通配符:能存不能仁簧汀;

總結(jié)

extends 和 the ? super 通配符的特征既鞠,我們可以得出以下結(jié)論:
◆ 如果你想從一個(gè)數(shù)據(jù)類(lèi)型里獲取數(shù)據(jù)煤傍,使用 ? extends 通配符(能取不能存)
◆ 如果你想把對(duì)象寫(xiě)入一個(gè)數(shù)據(jù)結(jié)構(gòu)里,使用 ? super 通配符(能存不能戎龅啊)
◆ 如果你既想存蚯姆,又想取,那就別用通配符洒敏。

參考鏈接:
夯實(shí)JAVA基本之一 —— 泛型詳解(1):基本使用
夯實(shí)JAVA基本之一——泛型詳解(2):高級(jí)進(jìn)階

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末龄恋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凶伙,更是在濱河造成了極大的恐慌郭毕,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件函荣,死亡現(xiàn)場(chǎng)離奇詭異铣卡,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)偏竟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)煮落,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人踊谋,你說(shuō)我怎么就攤上這事蝉仇。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵轿衔,是天一觀的道長(zhǎng)沉迹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)害驹,這世上最難降的妖魔是什么鞭呕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮宛官,結(jié)果婚禮上葫松,老公的妹妹穿的比我還像新娘。我一直安慰自己底洗,他們只是感情好腋么,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著亥揖,像睡著了一般珊擂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上费变,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天摧扇,我揣著相機(jī)與錄音,去河邊找鬼挚歧。 笑死扳剿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昼激。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锡搜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼橙困!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耕餐,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凡傅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后肠缔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體夏跷,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年明未,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了槽华。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趟妥,死狀恐怖猫态,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤亲雪,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布勇凭,位于F島的核電站,受9級(jí)特大地震影響义辕,放射性物質(zhì)發(fā)生泄漏虾标。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一灌砖、第九天 我趴在偏房一處隱蔽的房頂上張望璧函。 院中可真熱鬧,春花似錦周崭、人聲如沸柳譬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)美澳。三九已至,卻和暖如春摸航,著一層夾襖步出監(jiān)牢的瞬間制跟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工酱虎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雨膨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓读串,卻偏偏與公主長(zhǎng)得像聊记,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恢暖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

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

  • 在之前的文章中分析過(guò)了多態(tài)排监,可以知道多態(tài)本身是一種泛化機(jī)制,它通過(guò)基類(lèi)或者接口來(lái)設(shè)計(jì)杰捂,使程序擁有一定的靈活性舆床,但是...
    _小二_閱讀 688評(píng)論 0 0
  • 引言:泛型一直是困擾自己的一個(gè)難題,但是泛型有時(shí)一個(gè)面試時(shí)老生常談的問(wèn)題嫁佳;今天作者就通過(guò)查閱相關(guān)資料簡(jiǎn)單談?wù)勛约簩?duì)...
    cp_insist閱讀 1,850評(píng)論 0 4
  • 開(kāi)發(fā)人員在使用泛型的時(shí)候挨队,很容易根據(jù)自己的直覺(jué)而犯一些錯(cuò)誤。比如一個(gè)方法如果接收List作為形式參數(shù)蒿往,那么如果嘗試...
    時(shí)待吾閱讀 1,057評(píng)論 0 3
  • 一瓤漏、基本數(shù)據(jù)類(lèi)型 注釋 單行注釋?zhuān)?/ 區(qū)域注釋?zhuān)?* */ 文檔注釋?zhuān)?** */ 數(shù)值 對(duì)于byte類(lèi)型而言...
    龍貓小爺閱讀 4,268評(píng)論 0 16
  • 越是夜深人靜的時(shí)候越容易想起你情臭,很難受省撑,很想回到以前,一切都來(lái)得及的時(shí)候
    巴里桑閱讀 148評(píng)論 0 0