第七周-泛型學(xué)習(xí)(二)類型擦除

1.類型擦除是什么天通?

虛擬機(jī)沒有泛型類型對象莫瞬,所有類都屬于普通類。
通過對泛型類提供一個原始類型(山區(qū)類型參數(shù)后的泛型類型名)搓蚪,擦除類型變量蛤售。

2.類型擦除的方式?

擦除類型變量陕凹,替換為限定類型(無限定類型則替換為Object類)
無限定類型擦除:

public class Pair<T>{
  private T first;
  private T second;

  public Pair(T first ,T second){this.first = first; this.second = second;}

  public T getFirst(){return this.first;}
  public T getSecond(){return this.second;}

  public void setFirst(T first){this.first = first;}
  public void setSecond(T second){this.second = second;}
}

類型擦除后變?yōu)?/p>

public class Pair<T>{
  private T first;
  private T second;

  public Pair(T first ,T second){this.first = first; this.second = second;}

  public T getFirst(){return this.first;}
  public T getSecond(){return this.second;}

  public void setFirst(T first){this.first = first;}
  public void setSecond(T second){this.second = second}
}

限定類型擦除:

class Pair<T extends Manager> {
  private T a;
  public <T extends Manager> T getA(){return this.a}
  public setA(T value){this.a = value}
}

類型擦除后變?yōu)?/p>

class Manager{
  private Manager a;
  public Manager getA(){return this.a}
  public setA(Manager value){this.a = value}
}

3.約束與局限性

使用java泛型時修安排考慮一下限制悍抑,大多限制都是由類型擦除引起

  • 基本類型不能作為泛型的類型參數(shù)
    類似 Pair<double>和Pair<int>這種寫法是不成立的鳄炉,原因是類型擦除時后Pair為含有Object的類杜耙,而Object類是不能存儲基本數(shù)據(jù)類型的。
    解決方式:使用基本數(shù)據(jù)類型的包裝器拂盯,如Integer佑女、Double等
  • 運行時類型檢查只適用于原始類型
    由于虛擬機(jī)中的對象總是有一個特定的非泛型類型,因此所有的類型查詢只產(chǎn)生原始類型谈竿。泛型類調(diào)用getClass方法也只是返回原始類型而已团驱。
Pair<String> a = new Pair<>("ahdf","dfgr");
Pair<Integer> b = new Pair<>(1,2);
if (a.getClass() == b.getClass()){
 System.out.printf("true");  
}
//true
if (a instanceof Pair<String>) ; //Error
Pair<String> p = (Pair<String>) a ; //Error
  • 不能創(chuàng)建參數(shù)化類型的數(shù)組
    數(shù)組會記住原始數(shù)據(jù)類型并對數(shù)據(jù)類型進(jìn)行校驗,比如Pair[]數(shù)組空凸,可以轉(zhuǎn)換為Object數(shù)組嚎花,但試圖往數(shù)組中存入其他類型的數(shù)據(jù)時,就會拋出Array-StoreException的異常呀洲。
    而泛型因為泛型擦除紊选,實際是不會保存原數(shù)據(jù)標(biāo)記,出現(xiàn)給
    Pair<String>[] table = new Pair<String>[10]; //Error
    數(shù)組賦值時
    table[0] = new Pair<Integer>();
    由于類型擦除道逗,會導(dǎo)致這種類型檢查機(jī)制失效兵罢。
    但有一種情況可以支持泛型類型的數(shù)組,即泛型作為個數(shù)可變的參數(shù)傳入方法時
    public static <T> void addAll(T... ts){}
    這種情況只會得到一個警告,可以通過@SafeVarargs標(biāo)注方法的方式消除警告
  • 不能實例化參數(shù)變量
    不能使用像new T()這樣的寫法滓窍。因為類型擦除會將T改為Object卖词,而這種實例化方式只會實例化出一個Object對象。
    解決方式:
    1)提供構(gòu)造器表達(dá)式
    2)通過反射調(diào)用Class.newInstance方法來構(gòu)造泛型對象
  • 不能構(gòu)造泛型數(shù)組(吏夯?)
  • 不能在靜態(tài)域或方法中引用類型變量
public class Singleton<T>{
private static T singleInstance; //Error
public static T getSingleInstance(){  //Error
  ....
}
}

與泛型特性有關(guān)此蜈,可參見https://blog.csdn.net/aabbwoshishei/article/details/50187679的示例

  • 不能拋出或補(bǔ)貨泛型類的示例(即横?)

4.泛型類型的繼承規(guī)則

泛型學(xué)習(xí)(一)中提到過泛型的繼承規(guī)則,這種繼承規(guī)則限制如此嚴(yán)格的原因與上文提到的不能創(chuàng)建數(shù)組的原因類似裆赵。

Pair<Manager> managers = new Pair<>(ceo,cfo);
Pair<Employee> employees = managers ;  //illegal
employee.setFirst(lowlyEmploee);

managers和employees 實際上是引用的同樣的對象令境,但由于泛型的類型擦除,使得managers 也能存放employees 對象顾瞪,這對于managers 來說是不可能成立的舔庶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市陈醒,隨后出現(xiàn)的幾起案子惕橙,更是在濱河造成了極大的恐慌,老刑警劉巖钉跷,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弥鹦,死亡現(xiàn)場離奇詭異,居然都是意外死亡爷辙,警方通過查閱死者的電腦和手機(jī)彬坏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膝晾,“玉大人栓始,你說我怎么就攤上這事⊙保” “怎么了幻赚?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長臊旭。 經(jīng)常有香客問我落恼,道長,這世上最難降的妖魔是什么离熏? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任佳谦,我火速辦了婚禮,結(jié)果婚禮上滋戳,老公的妹妹穿的比我還像新娘钻蔑。我一直安慰自己,他們只是感情好胧瓜,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布矢棚。 她就那樣靜靜地躺著,像睡著了一般府喳。 火紅的嫁衣襯著肌膚如雪蒲肋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音兜粘,去河邊找鬼申窘。 笑死,一個胖子當(dāng)著我的面吹牛孔轴,可吹牛的內(nèi)容都是我干的剃法。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼路鹰,長吁一口氣:“原來是場噩夢啊……” “哼贷洲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晋柱,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤优构,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雁竞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钦椭,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年碑诉,在試婚紗的時候發(fā)現(xiàn)自己被綠了彪腔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡进栽,死狀恐怖德挣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泪幌,我是刑警寧澤盲厌,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站祸泪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏建芙。R本人自食惡果不足惜没隘,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望禁荸。 院中可真熱鬧右蒲,春花似錦、人聲如沸赶熟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽映砖。三九已至间坐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竹宋。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工劳澄, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜈七。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓秒拔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親飒硅。 傳聞我的和親對象是個殘疾皇子砂缩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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