泛型

什么是泛型桥言?為什么使用泛型?

泛型的出現(xiàn)意味著編寫的代碼可以被不同類型的對(duì)象所重用厌漂,提升了代碼的重用性。泛型的本質(zhì)是參數(shù)化類型斟珊,即將所需操作的數(shù)據(jù)類型設(shè)置為一個(gè)參數(shù)苇倡。
舉個(gè)實(shí)際中的栗子:我們需要設(shè)計(jì)一個(gè)柜子的類,柜子可以用于存放書本囤踩、食品或者衣物旨椒,但是我們?cè)谠O(shè)計(jì)階段不能確定柜子里具體要存放什么東西,那怎么來(lái)設(shè)計(jì)這樣一個(gè)通用型的柜子堵漱,這里就可以用到泛型综慎。所以,我們把存放元素的類型設(shè)計(jì)成一個(gè)參數(shù)勤庐,這個(gè)類型參數(shù)就稱之為泛型示惊。
舉個(gè)JAVA中的栗子:ArrayList<T>,List<T>好港,這個(gè)<T>就是類型參數(shù),也就是泛型米罚。為什么這么寫呢钧汹?因?yàn)槲覀冊(cè)趧?chuàng)建Arraylist或者List時(shí),無(wú)法確定里面具體存儲(chǔ)的元素的類型录择,但是我們有希望一個(gè)實(shí)例對(duì)象中存儲(chǔ)的元素的類型時(shí)一致的拔莱,這就需要泛型來(lái)實(shí)現(xiàn)操作。

        int[] arr1 = new int[] {159,357,456};
        //沒(méi)有用泛型隘竭,ArrayList中存儲(chǔ)的元素格式各樣塘秦,實(shí)際開發(fā)中在操作時(shí)是很容易出現(xiàn)問(wèn)題的
        List list1 = new ArrayList();
        list1.add(123);
        list1.add("敲代碼的阿茄");
        list1.add(arr1);
        //使用泛型,限制ArrayList存放的元素的類型动看,就不能添加存儲(chǔ)其他類型的元素了
        List<String> list2 = new ArrayList<>();
        list2.add("敲");
        list2.add("代");
        list2.add("碼");
        list2.add("的");
        list2.add("阿");
        list2.add("茄");
       //list2.add(123);//無(wú)法添加
       //list2.add(arr1);//無(wú)法添加

泛型使用的基本要求

  • 異常類不能聲明為泛型嗤形。
  • 泛型不能是基本數(shù)據(jù)類型,需要使用基本數(shù)據(jù)類型的泛型可以寫成其包裝類弧圆。
        //List<int> list2 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();

自定義泛型類

在類或接口中聲明的泛型赋兵,可以作為非靜態(tài)屬性的類型、非靜態(tài)方法的參數(shù)類型搔预、非靜態(tài)方法的返回值霹期。但是,不能在靜態(tài)方法中使用類的泛型拯田。

    // 泛型類:類中定義有不確定的類型
    public class Dict<T> {
        String dictName;
        int dictCount;
        T dictT;
        //泛型類下用了泛型的方法,報(bào)錯(cuò)历造,需要去掉static
        //public static void get(T dictT) {
        //  this.dictT = dictT;
        //}
        //泛型類下沒(méi)用泛型的方法
        public static void set() {
            System.out.println("");
        }
    }

泛型方法和泛型類下的方法?

泛型方法:該泛型方法所在的類可以不是泛型類船庇。往直觀一點(diǎn)講吭产,方法中出現(xiàn)了泛型結(jié)構(gòu)<>。
那么鸭轮,泛型方法可以是靜態(tài)的嗎臣淤?可以,因?yàn)榉盒蛥?shù)是在調(diào)用方法時(shí)確定的,并非在實(shí)例化時(shí)確定的窃爷。

      public class GenericTest {
            public static void main(String[] args) {
                Dict<Float> dict = new Dict<>();
                dict.set1(0.0f);
                //調(diào)用泛型方法邑蒋,泛型類型跟類的泛型沒(méi)關(guān)系,不受影響
                dict.set2(" ");
                dict.set2(36);
                dict.set2(new ArrayList());
            }
        }

        //泛型類
        class Dict<T> {
            String dictName;
            int dictCount;
            //泛型類中的方法:如果調(diào)用了泛型則不能為靜態(tài)
            public  void set1(T dictT) {
                System.out.println("我是泛型類下的方法");
            }
            //泛型方法:可以為靜態(tài)
            public  static <T> void set2(T dictT) {
                System.out.println("我是泛型方法");
            }
        }

泛型與繼承

  • 如果類A是類B的父類按厘,但是医吊,G<A>不是G<B> 的父類(G是類或者接口),兩個(gè)屬于不同的類逮京。所以不存在兩者間的多態(tài)和向上轉(zhuǎn)型卿堂。
  • 但是呢,A<G>仍然是B<G>的父類懒棉。

通配符

通配符:?
  • 利用通配符草描,創(chuàng)建二者的共同父類览绿,G<A>G<B>的共同父類G<?>
  • 但是陶珠,不能往其中添加新數(shù)據(jù),常用于賦值操作而已享钞,僅能添加null;
  • 允許讀取數(shù)據(jù)揍诽,讀取數(shù)據(jù)的類型為object;

舉例說(shuō)明:定義List<?>List<Object>List<String>的公共父類。

        //不能添加數(shù)據(jù)栗竖,除了null
        List<?> list = new ArrayList<>();
        //list.add(16);//報(bào)錯(cuò)
        //list.add(" ");//報(bào)錯(cuò)
        list.add(null);
        //允許讀取數(shù)據(jù)
        List<?> list = new ArrayList<>();
        List<String> list1 = new ArrayList<>();
        list1.add("newstring");
        list =list1;
        list.add(null);
        Object obj = list.get(0);
        System.out.println(obj);//newstring
有限制條件的通配符
  • G<? extends A>可以作為G<A>G<B>的父類暑脆,其中B是A的子類;即狐肢,可以作為所有繼承于A類的類G<A的子類>的父類添吗。
  • G<? super A>可以作為G<A>G<B>的父類,其中B是A的父類份名;即碟联,可以作為所有A的父類的G<A的父類>的父類。
        // 下面舉例類的關(guān)系:Earth extends Sun, Sun extends Universe
        List<? extends Sun> list1 = new ArrayList<>();// 可以作為L(zhǎng)ist<Sun及其子類>的父類
        List<? super Sun> list2 = new ArrayList<>();// 可以作為L(zhǎng)ist<Sun及其父類>的父類
        List<Universe> list3 = new ArrayList<>();
        List<Sun> list4 = new ArrayList<>();
        List<Earth> list5 = new ArrayList<>();
        list1 = list4;// 多態(tài)
        list2 = list4;//多態(tài)
        // 讀取數(shù)據(jù)
        Sun s1 =list1.get(0);//獲取的數(shù)據(jù)是Sun或者Sun的子類的對(duì)象僵腺,可以實(shí)現(xiàn)多態(tài)
        Earth e1 =(Earth)list1.get(0);//不強(qiáng)轉(zhuǎn)會(huì)報(bào)錯(cuò)鲤孵,因?yàn)楂@取的數(shù)據(jù)可能是Sun的對(duì)象,父類轉(zhuǎn)子類需要強(qiáng)轉(zhuǎn)
        Sun s2=(Sun)list2.get(0);//不強(qiáng)轉(zhuǎn)會(huì)報(bào)錯(cuò)辰如,獲取的數(shù)據(jù)可能是Sun的父類普监,父類轉(zhuǎn)子類需要強(qiáng)轉(zhuǎn)
        Object o=list2.get(0);//不強(qiáng)轉(zhuǎn)情況下,只能是Object
        // 寫入數(shù)據(jù)
        list2.add(new Sun());//只能添加Sun本身琉兜,或者Sun的子類
        //因?yàn)閘ist2存的可能是Sun及其父類凯正,假設(shè)new的是Universe,但是list2中存儲(chǔ)的是Sun,
        //即實(shí)際?=Sun,那么Universe作為父類是無(wú)法直接賦給子類的
        list2.add(new Earth());
        //list1.add();//無(wú)法添加數(shù)據(jù)豌蟋,因?yàn)槟銦o(wú)法確定存儲(chǔ)的子類有多小
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廊散,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梧疲,更是在濱河造成了極大的恐慌奸汇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往声,死亡現(xiàn)場(chǎng)離奇詭異擂找,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)浩销,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門贯涎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人慢洋,你說(shuō)我怎么就攤上這事塘雳÷脚蹋” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵败明,是天一觀的道長(zhǎng)隘马。 經(jīng)常有香客問(wèn)我,道長(zhǎng)妻顶,這世上最難降的妖魔是什么酸员? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮讳嘱,結(jié)果婚禮上幔嗦,老公的妹妹穿的比我還像新娘。我一直安慰自己沥潭,他們只是感情好邀泉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钝鸽,像睡著了一般汇恤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拔恰,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天屁置,我揣著相機(jī)與錄音,去河邊找鬼仁连。 笑死蓝角,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饭冬。 我是一名探鬼主播使鹅,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昌抠!你這毒婦竟也來(lái)了患朱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炊苫,失蹤者是張志新(化名)和其女友劉穎裁厅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侨艾,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡执虹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唠梨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袋励。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茬故,到底是詐尸還是另有隱情盖灸,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布磺芭,位于F島的核電站赁炎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钾腺。R本人自食惡果不足惜徙垫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垮庐。 院中可真熱鬧松邪,春花似錦坞琴、人聲如沸哨查。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寒亥。三九已至,卻和暖如春荧关,著一層夾襖步出監(jiān)牢的瞬間溉奕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工忍啤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留加勤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓同波,卻偏偏與公主長(zhǎng)得像鳄梅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子未檩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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

  • 1冤狡、概述 在之前的27孙蒙、【JavaSE】【Java 核心類庫(kù)(上)】集合類-Collection[%5Bhttps...
    yscyber閱讀 203評(píng)論 0 1
  • [toc] 一、為什么要有泛型 1.1泛型:標(biāo)簽 1.2 設(shè)計(jì)背景: 集合容器在設(shè)計(jì)階段或聲明階段不能確定這個(gè)容器...
    bjfStart閱讀 135評(píng)論 0 0
  • 1. 泛型的概念 1.1 什么是泛型 泛型類似標(biāo)簽悲雳,出現(xiàn)原因是因?yàn)椋杭先萜黝愒谠O(shè)計(jì)階段/聲明階段不能確定這個(gè)容器...
    爾玉RGX閱讀 217評(píng)論 0 1
  • java泛型解決容器挎峦,不確定類型問(wèn)題,多個(gè)返回值合瓢,避免類型轉(zhuǎn)換浑测。 類泛型 類泛型定義的時(shí)候需要在類型后增加尖括號(hào),...
    wangsye閱讀 451評(píng)論 0 0
  • 寫在之前 以下是《瘋狂Java講義》中的一些知識(shí),如有錯(cuò)誤迁央,煩請(qǐng)指正掷匠。 泛型初衷 集合對(duì)元素類型沒(méi)有任何限制,這樣...
    hainingwyx閱讀 385評(píng)論 0 0