泛型的學(xué)習(xí)總結(jié)

泛型的定義:

泛型的本質(zhì)就是參數(shù)化類型的應(yīng)用,也就是說(shuō)所有操作的數(shù)據(jù)類型都被指定為一個(gè)參數(shù)绘雁,在用到的時(shí)候才指定具體的類型橡疼。這種參數(shù)類型可以用在類,接口和方法中創(chuàng)建庐舟,分別稱為泛型類衰齐,泛型接口和泛型方法。

泛型的作用

  • 類型安全

泛型的主要目的是提到Java程序的安全继阻,在編譯時(shí)期強(qiáng)制類型檢查耻涛,通過(guò)知道使用泛型泛型定義的變量限制,編譯器可以在一個(gè)高得多得程度上驗(yàn)證類型假設(shè)瘟檩。

  • 消除強(qiáng)制類型轉(zhuǎn)換

泛型得作用之一就是消除代碼中得強(qiáng)制類型轉(zhuǎn)換抹缕,減少出錯(cuò)得機(jī)會(huì)。

  • 潛在得性能收益

泛型為較大得優(yōu)化帶了可能墨辛,編譯器將強(qiáng)制類型轉(zhuǎn)換卓研,插入到字節(jié)碼文件中,所有得工作都在編譯期間完成睹簇。

  • 泛型提高代碼得復(fù)用性

可以通過(guò)泛型提高復(fù)用性奏赘,不需要寫大量重復(fù)的代碼。

泛型使用

泛型類

泛型類型用于定義類太惠,稱為泛型類磨淌,常見(jiàn)的泛型類有List,set凿渊,map梁只。泛型類的定義格式:

class 類名稱<泛型標(biāo)識(shí)符:可以是任意字母>{}

例子:


//泛型類
/**
 * 在定義泛型類的時(shí)候,一定要指明泛型表示
 * 而我類中如果使用到該泛型埃脏,一定要用與類定義的泛型標(biāo)識(shí)搪锣。
 *
 * @param <T>
 */
class Generic<T>{
    //T類型跟類的是一樣的,由外部指定
    public Generic(T value) {
        print(value);
    }
    //泛型類的一個(gè)方法彩掐,但不是泛型方法构舟,只不過(guò)使用了T這個(gè)泛型做為形參而已。
    public void print(T value) {
        System.out.println(value.toString());
    }
}

使用:

Generic<String> strGerneric=new Generic<>("字符類型");
Generic<Integer> intGerneric=new Generic<>(111);

結(jié)果:


image.png

注意:

泛型參數(shù)只能是類類型堵幽,不能是簡(jiǎn)單類型

不能對(duì)確切的泛型使用instanceof操作狗超。

泛型接口

定義:

//泛型接口

/**
 *和泛型類的定義要求類似弹澎,根式類似,可以指定任意字母當(dāng)標(biāo)識(shí)符
 * @param <I>
 */
 interface GenericInterface<I> {
    void print(I value);
}`

在繼承該接口的時(shí)候可以直接指定具體的類型抡谐,不也可以通過(guò)泛型類的形式使用裁奇。

 class Test<I> implements GenericInterface<I>{

    @Override
    public void print(I value) {
    }
 }
 
 class GenericTest implements GenericInterface<Integer>{

    @Override
    public void print(Integer value) {
    }
     
 }
泛型方法

泛型方法在定義的時(shí)候要注意格式,在定義的時(shí)候在方法類型返回的返回簽名加上<標(biāo)識(shí)符>

  class GenericMethod<T> {
     /**
      * 泛型方法,雖然泛型的標(biāo)識(shí)符與泛型類的相同都是T麦撵,但是兩者卻是不同
      * 泛型方法中需要定義泛型標(biāo)識(shí)刽肠,例如<T>
      * @param value
      * @return
      */
     public <T> T method1(T value) {
        return value;
     }
     public <M> void  method2(M value) {
         
     }
     /**
      * 這個(gè)不是泛型方法,只是利用泛型做為形參
      * @param value
      */
     public void notMethod(T value) {}
     
     
     //也可以定義一個(gè)泛型方法與可變參數(shù),例如使用的時(shí)候可以 genericMethod.changeParamsMethod(1,2,3);
     public <T> void changeParamsMethod(T... valuse) {
         for(T t:valuse) {
             System.out.println(t);
         }
     }
     
     /**
      * 在靜態(tài)方法中免胃,是使用不了泛型類定義的標(biāo)識(shí)的音五,例如下面是會(huì)報(bào)錯(cuò)
      */
    /**
     *  public static void staticMethod(T value) {}
     *  因?yàn)殪o態(tài)方法是不持有類的引用,是訪問(wèn)不了類非靜態(tài)的方法羔沙,變量等躺涝。因此我們必須用泛型方法
     */
     public static <T> void staticMethod(T value) {
         
     }
     
         
 }

泛型通配符

Integer是Number的子類,那么我們下面的那部分的代碼會(huì)不會(huì)有問(wèn)題呢扼雏?


image.png

可以看到上面的方法已經(jīng)報(bào)錯(cuò)了坚嗜,所明是不行的,通過(guò)提示信息我們可以看到Generic<Integer>不能被看作為`Generic<Number>的子類诗充。由此可以看出:同一種泛型可以對(duì)應(yīng)多個(gè)版本(因?yàn)閰?shù)類型是不確定的)苍蔬,不同版本的泛型類實(shí)例是不兼容的,那么如何解決呢蝴蜓?首先我們可以通過(guò)泛型方法來(lái)解決上面的問(wèn)題碟绑,還有就是通過(guò)泛型通配符。

public static void main(String[] args) {
        Generic<Integer> genericInteger=new Generic<>(1);
        Generic<Number> genericNumber=new Generic<>(1);
        showKey(genericInteger);
        showKey(genericNumber);
        showKeyWildcard(genericInteger);
        showKeyWildcard(genericNumber);
        
    }
    /**
     * 泛型方法
     * @param nGeneric
     */
    private static <T> void showKey(Generic<T> nGeneric) {
        System.out.println(nGeneric.hashCode());
    }
    /**
     * 泛型通配符
     * @param value
     */
    private static void showKeyWildcard(Generic<?> value) {
        System.out.println(value.hashCode());
    }

泛型通配符的類型

  • 無(wú)邊界通配符:<?>
    使用外邊界的通配符可以讓泛型接受任意類型的數(shù)據(jù)
  • 上邊界通配符:<? extends 具體類型>
    使用固定上邊屆的通配符的泛型可以接收的是指定類型及其子類類型的數(shù)據(jù)茎匠。
  • 下邊界通配符:<? super 具體類型>
    使用固定下邊界的通配符的泛型可以接收指定類型及其所有超類類型的數(shù)據(jù)格仲。

泛型的擦除

Java的泛型是偽泛型,泛型基本導(dǎo)航都是在編譯器這個(gè)層次來(lái)實(shí)現(xiàn)的诵冒,生成的Java類型字節(jié)碼中是不包含泛型的類型凯肋。使用泛型的時(shí)候加上的泛型參數(shù),會(huì)在編譯器在編譯的時(shí)候去掉造烁,這個(gè)過(guò)程就是泛型擦除否过。具體參考泛型的擦除

參考鏈接:http://www.reibang.com/p/adc6b0574b9c

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惭蟋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌药磺,老刑警劉巖告组,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異癌佩,居然都是意外死亡木缝,警方通過(guò)查閱死者的電腦和手機(jī)便锨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)我碟,“玉大人放案,你說(shuō)我怎么就攤上這事〗冒常” “怎么了吱殉?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)厘托。 經(jīng)常有香客問(wèn)我友雳,道長(zhǎng),這世上最難降的妖魔是什么铅匹? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任押赊,我火速辦了婚禮,結(jié)果婚禮上包斑,老公的妹妹穿的比我還像新娘流礁。我一直安慰自己,他們只是感情好罗丰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布神帅。 她就那樣靜靜地躺著,像睡著了一般丸卷。 火紅的嫁衣襯著肌膚如雪枕稀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天谜嫉,我揣著相機(jī)與錄音萎坷,去河邊找鬼。 笑死沐兰,一個(gè)胖子當(dāng)著我的面吹牛哆档,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播住闯,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼瓜浸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了比原?” 一聲冷哼從身側(cè)響起插佛,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎量窘,沒(méi)想到半個(gè)月后雇寇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年锨侯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嫩海。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡囚痴,死狀恐怖叁怪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情深滚,我是刑警寧澤奕谭,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站成箫,受9級(jí)特大地震影響展箱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹬昌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一混驰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧皂贩,春花似錦栖榨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辈末,卻和暖如春愚争,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挤聘。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工轰枝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人组去。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓鞍陨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親从隆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诚撵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345