JAVA泛型

一吭敢、泛型簡介

1、目的

  • 語法糖:
    也稱糖衣語法缭受,指在計算機語言中添加的某種語法胁澳,這種語法對語言的功能并沒有影響,但是更方便程序員使用米者。
    Java中最常用的語法糖主要有泛型韭畸、變長參數(shù)宇智、條件編譯、自動拆裝箱胰丁、內(nèi)部類等随橘。
    服擬機并不支持這些語法,它們在編譯階段就被還原回了簡單的基礎(chǔ)語法結(jié)構(gòu)锦庸,這個過程成為解語法糖机蔗。
  • 泛型的目的:
    Java 泛型就是把一種語法糖,通過泛型使得在編譯階段完成一些類型轉(zhuǎn)換的工作甘萧,避免在運行時強制類型轉(zhuǎn)換而出現(xiàn) ClassCastException萝嘁,即類型轉(zhuǎn)換異常。

  • 泛型的作用:
    可以把類型參數(shù)看作是使用參數(shù)化類型時指定的類型的一個占位符扬卷。

List<String> list = new ArrayList<>();

2牙言、泛型的好處

  1. 類型安全。類型錯誤現(xiàn)在在編譯期問就被捕獲到了怪得,而不是在運行時當(dāng)作
    java.lang. Class CastException展示出來咱枉,將類型檢查從運行時挪到編譯時有助于開
    發(fā)者更容易找到錯誤,并提高程序的可靠性徒恋。
  2. 消除了代碼中許多的強制類型轉(zhuǎn)換庞钢,增強了代碼的可讀性。
  3. 為較大的優(yōu)化帶來了可能因谎。

二基括、泛型的使用

1、泛型類和泛型接口

1/定義接口時指定了一個類型形參财岔,該形參名為E
public interface List<E> extends Collection<E>{
  //在該接口里风皿,E可以作為類型使用
  public E get (int index) {}
  public void add(E e) {}
}

1/定義類時指定了一個類型形參,該形參名為E
public class ArrayList<E> extends AbstractList<E> implements List<E> {
//在該類里匠璧,E可以作為類型使用
  public void set(E e) {
  -------
  }
}

這就是泛型的實質(zhì):允許在定義接口桐款、類時聲明類型形參,類型形參在整個接口夷恍、類體內(nèi)可當(dāng)成類型使用魔眨,幾乎所有可使用普通類型的地方都可以使用這種類型形參

  • 泛型類
    定義一個容器類,存放鍵值對key-value酿雪,鍵值對的類型不確定遏暴,可以使用泛型來定義,分別指定為K和V指黎。
public class Container<K, V> {
  private K key;
  private V value;

  public Container (K k, V V) {
    key = k;
    value= V;
  }
  public K getkey) {
    return key;
  }
  public V getValue() {
    return value;
  }
  public void setKey() {
    this. key = key;
  }
  public void setvalue) {
    this. value = value;
  }
}

JDK1.7增加了泛型的“菱形"語法:Java允許在構(gòu)造器后不需要帶完成的泛型信息朋凉,只要給出一對尖括號(<>)即可,Java可以推斷尖括號里應(yīng)該是什么泛型信息;List<String> list = new ArrayList<>();

  • 泛型類派生子類
    當(dāng)創(chuàng)建了帶泛型聲明的接口醋安、父類之后杂彭,可以為該接口創(chuàng)建實現(xiàn)類墓毒,或者從該父類派生子類,需要注意:使用這些接口亲怠、父類派生子類時不能再包含類型形參所计,需要傳入具體的類型。

2团秽、泛型方法

所謂泛型方法主胧,就是在聲明方法時定義一個或多個類型形參。泛型方法的用法格式如下:

修飾符 <T徙垫,S> 返回值類型 方法名(形參列表){
  方法體
}

注意:方法聲明中定義的形參只能在該方法里使用,而接口放棒、類聲明中定義的類型形參則可以在整個接口姻报、類中使用。

public <T> T fun(T t){
  return t;
}

3间螟、泛型構(gòu)造器

正如泛型方法允許在方法簽名中聲明類型形參一樣吴旋,Java也允許在構(gòu)造器簽名中聲明類型形參,這樣就產(chǎn)生了所謂的泛型構(gòu)造器厢破。
和使用普通泛型方法一樣沒區(qū)別荣瑟,一種是顯式指定泛型參數(shù),另一種是隱式推斷摩泪;如果是顯式指定則以顯式指定的類型參數(shù)為準(zhǔn)笆焰,如果傳入的參數(shù)的類型和指定的類型實參不符,將會編譯報錯见坑。

//隱式
new Person(22);
//顯示
new<String> Person("Hello");

三嚷掠、類型通配符

類型通配符:顧名思義就是匹配任意類型的類型實參;

類型通配符是一個問號(荞驴?)不皆,將一個問號作為類型實參傳給List集合,寫
作:List<?>(意恩是元素類型未知的List)熊楼。這個問號(霹娄?)被成為通配符,它
的元素類型可以匹配任何類型鲫骗。

1犬耻、帶限通配符

  1. 上限通配符
    如果想限制使用泛型類別時,只能用某個特定類型或者是其子類型才能實例化該類型時执泰,可以在定義類型時香追,使用extends 關(guān)鍵字指定這個類型必須是繼承某個類,或者實現(xiàn)某個接口坦胶,也可以是這個類或接口本身透典。
它表示集合中的所有元素都是Shape 類型或者其子類晴楔。
List<? extends Shape>
  1. 下限通配符
    如果想限制使用泛型類別時,只能用某個特定類型或者是其父類型才能實例化該類型時峭咒,可以在定義類型時税弃,使用super關(guān)鍵字指定這個類型必須是是某個類的父類,或者是某個接口的父接口凑队,也可以是這個類或接口本身则果。
它表示集合中的所有元素都是Circle類型或者其父類。
List<? super Circle>

注意:
extends 可用于的返回類型限定漩氨,不能用于參數(shù)類型限定西壮。
super 可用于參數(shù)類型限定,不能用于返回類型限定叫惊。
List<? extends Fruit> list = new ArrayList<Apple>();
不能使用list.add方法添加元素款青;
List<? super Fruit> flist = new ArrayList<Fruit>();
不能使用list.get方法獲取元素;

2霍狰、類型擦除

Class c1=new ArrayList<Integer>().getclass();
Class c2=new ArrayList<String>().getclass();
System.out.println(c1==c2);
這個值為true

這是因為不管為泛型的類型形參傳入哪一種類型實參抡草,對于Java來說,它們依然被當(dāng)成同一類處理蔗坯,在內(nèi)存中也只占用一塊內(nèi)存空間康震。從Java泛型這一概念提出的目的來看,其只是作用于代碼編譯階段宾濒,在編譯過程中腿短,對于正確檢驗泛型結(jié)果后,會將泛型的相關(guān)信息擦出绘梦,也就是說答姥,成功編譯過后的class文件中是不包含任何泛型信息的。泛型信息不會進(jìn)入到運行時階段谚咬。
在靜態(tài)方法鹦付、靜態(tài)初始化塊或者靜態(tài)變量的聲明和初始化中不允許使用類型形參。由于系統(tǒng)中并不會真正生成泛型類择卦,所以instanceof運算符后不能使用泛型類敲长。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秉继,隨后出現(xiàn)的幾起案子祈噪,更是在濱河造成了極大的恐慌,老刑警劉巖尚辑,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辑鲤,死亡現(xiàn)場離奇詭異,居然都是意外死亡杠茬,警方通過查閱死者的電腦和手機月褥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門弛随,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宁赤,你說我怎么就攤上這事舀透。” “怎么了决左?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵愕够,是天一觀的道長。 經(jīng)常有香客問我佛猛,道長惑芭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任继找,我火速辦了婚禮峻贮,結(jié)果婚禮上茁计,老公的妹妹穿的比我還像新娘板乙。我一直安慰自己笙以,他們只是感情好感挥,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布缩搅。 她就那樣靜靜地躺著,像睡著了一般触幼。 火紅的嫁衣襯著肌膚如雪硼瓣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天置谦,我揣著相機與錄音堂鲤,去河邊找鬼。 笑死媒峡,一個胖子當(dāng)著我的面吹牛瘟栖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谅阿,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼半哟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了签餐?” 一聲冷哼從身側(cè)響起寓涨,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氯檐,沒想到半個月后戒良,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡冠摄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年糯崎,在試婚紗的時候發(fā)現(xiàn)自己被綠了几缭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拇颅,死狀恐怖奏司,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情樟插,我是刑警寧澤韵洋,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站黄锤,受9級特大地震影響搪缨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸵熟,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一副编、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧流强,春花似錦痹届、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奏篙,卻和暖如春柴淘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秘通。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工为严, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肺稀。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓第股,卻偏偏與公主長得像,于是被迫代替她去往敵國和親话原。 傳聞我的和親對象是個殘疾皇子夕吻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353