泛型擦除,教你怎麼用可樂瓶裝雞蛋

在學習集合的時候,我們會接觸到泛型。利用泛型,可以很好的控制集合中添加的數據。但是深入瞭解之後,會發現泛型只在編譯時期起作用。而運行時期泛型會被擦除。

什麼意思呢?舉個簡單的例子,坐火車要過安檢。就相當於泛型的作用就相當於安檢。只在進站的時候起作用,而你進去之後通過其它手段拿到了一些違禁品安檢也管不到你。

假設已經有類Egg、Coke兩個類。分別是雞蛋、可樂。

先創建一個可樂瓶:

public void demo1(){
  //創建一個只能裝可樂的可樂瓶
  List<Coke> cokeBottle = new ArrayList<Coke>();
}

然後嘗試放雞蛋進去:

Egg egg = new Egg();
Coke coke = new Coke();
//添加可樂沒有問題
cokeBottle.add(coke;)
//放入雞蛋。這時候,這句代碼會報錯
cokeBottle.add(egg);

因爲泛型的關係,放雞蛋的代碼出錯了。那麼要怎麼才能放雞蛋呢?我們先獲取cokeBottle(可樂瓶)編譯後的Class對象:

Class<? extends List> aClass = cokeBottle.getClass();

然後把添加可樂的方法找到:

Method add = aClass.getDeclaredMethod("add", Object.class);

然後再來放雞蛋:

//因爲是使用反射,這個時候泛型已經被擦除了。可以添加任何數據
add.invoke(cokeBottle, egg);

這樣就把雞蛋放進去了,前面的代碼是有異常的,大家可以自由抓或者拋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章