泛型

泛型的作用

  • 多種數(shù)據(jù)類型執(zhí)行相同的代碼
  • 規(guī)范數(shù)據(jù)類型骂维,在編譯時發(fā)出警告,防止出現(xiàn)cast異常

泛型的使用

  • 泛型類:
public class NormalGeneric<T> {
    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}


public static void main(String[] args) {
        NormalGeneric<String> normalGeneric = new NormalGeneric<>();
        normalGeneric.setData("12345");
        System.out.println(normalGeneric.getData());  // 輸出12345
    }

聲明了一個泛型類,泛型為T冰单,T類似一個形參,在使用這個類的時候為這個T傳入一個實參灸促,類中所有用到的T都替換成實參String球凰,實參必須是一個對象類型;

  • 泛型接口:
public interface People<T>{
        public T talk();
    }

定義了一個People接口腿宰,指定了一個泛型T呕诉,接口內(nèi)部有一個talk抽象方法;

實現(xiàn)方式1:泛型類實現(xiàn)泛型接口
class Student<T> implements People<T>{
        @Override
        public T talk() {
            return null;
        }
    }
實現(xiàn)方式2:普通類實現(xiàn)泛型接口(直接指定泛型的實際類型)
class Teacher implements People<String>{
        @Override
        public String talk() {
            return null;
        }
    }
  • 泛型方法:
public  <T> T plus(){
        T result = null;
        //  todo
        return result;
    }

在使用這個方法的時候指定泛型的實際類型

normalGeneric.<Integer>plus(123);

也可以省去泛型的實際類型吃度,編譯器借助傳入的參數(shù)會自動設置泛型的值

normalGeneric.plus("abc");

泛型變量的限定

public <T extends Comparable> T max(T a,T b){
        return a.compareTo(b)>0?a:b;
    }

class Man<T extends Comparable>{
        T man;
        public T getMan() {
            man.compareTo(man);  //  具有Compareable接口屬性
            return man;
        }
    }

如果我們需要泛型變量具有特定接口的屬性甩挫,可以給泛型T 繼承一個接口,用來限定這個泛型的變量必須擁有這個接口的屬性椿每,傳入的a和b必須實現(xiàn)Compareable接口伊者;
T的extends后面英遭,如果有類必須寫在第一個,并且只能有一個類亦渗,可以有多個接口(單繼承挖诸,多實現(xiàn))

泛型的局限

  • 不能實例化泛型類型:不能new T()

  • 靜態(tài)域不能引用類型變量:應為static靜態(tài)屬性先加載,而泛型的確認是在對象new的時候才知道法精;

  • 必須是包裝類型多律,不能是基礎類型

  • 不能使用instanceof判斷對象類型
  • 泛型類不能繼承異常

泛型的通配符

類型之間的繼承關系不能保證泛型之間的繼承關系
下面舉一個例子說明這句話的意思

首先聲明了如下四個繼承關系的類

public class Food {
}

public class Fruit extends Food {
}

public class Apple extends Fruit {
}

public class Orange extends Fruit {
}

再聲明一個標準的泛型類

public class GenericType<T> {
    private T data;
    public void setData(T data) {
        this.data = data;
    }
    public T getData() {
        return data;
    }
}

我們聲明了一個eat方法,傳入的參數(shù)是泛型為Fruit的標準泛型類搂蜓,創(chuàng)建了兩個標準泛型類狼荞,一個泛型是Fruit,一個泛型是Apple帮碰,當調(diào)用eat方法時相味,只有fruit有效,apple卻不行殉挽,可是apple明明繼承了fruit丰涉,也是水果,為什么不能吃呢斯碌?一死?

因為類型的繼承不能保證泛型變量之間的繼承關系,為了解決吃apple的問題输拇,引入了通配符 摘符?


我們將泛型的"實參"改成? extends Fruit,表示接收上界為Fruit的類型(Fruit和Fruit的子類)

下面再理解一句話:通配符用于安全的訪問數(shù)據(jù)

為什么setdata()的時候不管傳入fruit還是apple都是不行的策吠,因為通配符? extends Fruit規(guī)定了可能是Fruit逛裤,可能是Apple,也可能是Orange猴抹,不確定傳入的是哪個带族,所以set的時候都不可以,但是在取出的時候蟀给,有一點可以保證蝙砌,那就是一定是Fruit,(因為Apple和Orange也是Fruit)跋理,所以通配符用于安全的訪問數(shù)據(jù)

通配符只能用在泛型方法上择克,不可以用在泛型類上
? super Apple表示Apple 和 Apple 的父類:安全的寫入數(shù)據(jù)

super通配符可以set當前類和其子類,get Object類
extends通配符不能set 前普, 只能get當前類和其父類

泛型的原理

類型擦除:(在編譯期完成)

在jdk中的泛型是偽泛型肚邢,泛型類型在編譯的時候會被擦除,jvm看到的只有原始類型ArrayList<String> 和 ArrayList<Object> 在jvm看來是一樣的

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骡湖,隨后出現(xiàn)的幾起案子贱纠,更是在濱河造成了極大的恐慌,老刑警劉巖响蕴,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆焊,死亡現(xiàn)場離奇詭異,居然都是意外死亡浦夷,警方通過查閱死者的電腦和手機辖试,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來军拟,“玉大人剃执,你說我怎么就攤上這事誓禁⌒赶ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵摹恰,是天一觀的道長辫继。 經(jīng)常有香客問我,道長俗慈,這世上最難降的妖魔是什么姑宽? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮闺阱,結果婚禮上炮车,老公的妹妹穿的比我還像新娘。我一直安慰自己酣溃,他們只是感情好瘦穆,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赊豌,像睡著了一般扛或。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碘饼,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天熙兔,我揣著相機與錄音,去河邊找鬼艾恼。 笑死住涉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的钠绍。 我是一名探鬼主播舆声,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼五慈!你這毒婦竟也來了纳寂?” 一聲冷哼從身側(cè)響起主穗,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毙芜,沒想到半個月后忽媒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡腋粥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年闹瞧,在試婚紗的時候發(fā)現(xiàn)自己被綠了展辞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蘸朋,靈堂內(nèi)的尸體忽然破棺而出藕坯,到底是詐尸還是另有隱情炼彪,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站贞奋,受9級特大地震影響轿塔,放射性物質(zhì)發(fā)生泄漏揍障。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咬摇。 院中可真熱鬧肛鹏,春花似錦昭雌、人聲如沸烛卧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至融虽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茴迁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘉竟。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓边苹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親聊疲。 傳聞我的和親對象是個殘疾皇子茬底,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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

  • 1.泛型的由來 一般的類和方法,只能使用具體的類型,要么是基本數(shù)據(jù)類型贡珊,要么是自定義的類型最爬,如果要編寫可以適用于多...
    BigDreamMaker閱讀 556評論 0 1
  • “泛型”這個術語的意思是:"適用于許多許多的類型”。如何做到這一點呢叶沛,正是通過解耦類或方法與所使用的類型之間的約束...
    王偵閱讀 1,138評論 0 0
  • 參數(shù)類型的好處 在 Java 引入泛型之前,泛型程序設計是用繼承實現(xiàn)的悦昵。ArrayList 類只維護一個 Obje...
    杰哥長得帥閱讀 886評論 0 3
  • 泛型程序設計 泛型程序設計意味著編寫的代碼可以被很多不同類型的對象所重用肴茄。例如ArrayList類可以聚集任何類型...
    Steven1997閱讀 716評論 1 0
  • ① 何為溝通?我所理解的夠通棋凳,應該是信息的互相傳遞拦坠,對于不一致的信息雙方進行討論,最終得到一致的反饋...
    斌心依舊閱讀 211評論 0 2