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

2021-09-27 03:07:27 字數 855 閱讀 5359

在學習集合的時候,我們會接觸到泛型。利用泛型,可以很好的控制集合中新增的資料。但是深入了解之後,會發現泛型只在編譯時期起作用。而執行時期泛型會被擦除。

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

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

先建立乙個可樂瓶:

public void demo1()
然後嘗試放雞蛋進去:

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);

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

Java泛型擦除

class person public class test else 上面的例子執行 equal這裡列印出equal的原因,list和list list擦除後的型別都是list,沒有任何區別。其實泛型的class物件都是相同的,泛型化不會改變class屬性的返回值。再看看下面的例子 private...

泛型擦除補償

由於在使用泛型的時候,將會擦除型別引數,而只保留原始型別。所以在使用泛型時,我們不能使用new t 也不能使用instanceof,因為這兩類操作要知道確切的型別。此問題的解決方案有三種 設計模式的使用 簡單工廠 最簡單 工廠方法 最靈活 模板方法 最簡捷 1.簡單工廠 在此方法中,將型別作為引數,...

泛型 泛型類 泛型方法 泛型擦除

1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...