新聞中心
今天我們來講解泛型中另一個(gè)重要知識(shí)點(diǎn)——泛型擦除!

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬主機(jī)、營銷軟件、網(wǎng)站建設(shè)、撫州網(wǎng)站維護(hù)、網(wǎng)站推廣。
泛型擦除概念
泛型信息只存在于代碼編譯階段,但是在java的運(yùn)行期(已經(jīng)生成字節(jié)碼文件后)與泛型相關(guān)的信息會(huì)被擦除掉,專業(yè)術(shù)語叫做類型擦除。我們來看一個(gè)例子:
- ArrayList
l1 = new ArrayList(); - ArrayList
l2 = new ArrayList(); - System.out.println(l1.getClass()==l2.getClass());
運(yùn)行代碼,結(jié)果為True
這是因?yàn)锳rrayList
通過下面的例子我們做進(jìn)一步的分析
- import java.lang.reflect.Field;
- public class GeneErasure
{ - T object;
- public GeneErasure(T object) {
- this.object = object;
- }
- public static void main(String[] args) {
- GeneErasure demo = new GeneErasure
("hi"); - Class classz = demo.getClass();
- System.out.println(classz.getName());
- //輸出com.my.generic.GeneErasure
- Field[] fs = classz.getDeclaredFields();
- for ( Field f:fs) {
- System.out.println("feild: "+f.getName()+"type:"+f.getType().getName());
- //輸出feild: object type:java.lang.Object
- }
- }
通過這個(gè)例子我們可以看到Class 的類型仍然是GeneErasure并不是GeneErasure
輸出結(jié)果為:
- feild: object type:java.lang.String
所以,在泛型類被類型擦除的時(shí)候,之前泛型類中的類型參數(shù)部分如果沒有指定上限,如
利用類型擦除干“壞事兒”
大家都知道,下面這段代碼l.add(123)無法編譯通過,因?yàn)?23不是String類型,這也是使用泛型的好處之一。
- ArrayList
l=new ArrayList (); - l.add("abc");
- l.add(123);
但是我們理解了泛型擦除的原理,我們可以巧妙地利用這個(gè)原理結(jié)合反射知識(shí)干一些“壞事”,例如:
- ArrayList
l=new ArrayList (); - l.add("abc");
- try {
- Method method = l.getClass().getDeclaredMethod("add",Object.class);
- method.invoke(l,"test");
- method.invoke(l,100.f);
- }catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("list的大小是:"+l.size());
- for ( Object o: l){
- System.out.println(o);
- }
運(yùn)行結(jié)果是:
- list的大小是:3
- abc
- test
- 100.0(被成功插入到ArrayList中)
我們可以看見100.0 成功地插入到ArrayList
通俗的理解
我們可以將泛型比作是一個(gè)看守,他來守護(hù)我們的代碼安全,然后設(shè)置各項(xiàng)規(guī)定,“xxx 禁止出入”的提醒。而現(xiàn)實(shí)生活中,也總會(huì)有些人能夠基于對(duì)門衛(wèi)們生活作息的規(guī)律,繞開他們的監(jiān)視(反射結(jié)合泛型擦除)來干一些壞事兒 。
本文名稱:詳解Java泛型之十分鐘理解泛型擦除
分享路徑:http://m.fisionsoft.com.cn/article/coedeed.html


咨詢
建站咨詢
