日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
詳解Java泛型之十分鐘理解泛型擦除

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

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬主機(jī)、營(yíng)銷軟件、網(wǎng)站建設(shè)、撫州網(wǎng)站維護(hù)、網(wǎng)站推廣。

泛型擦除概念

泛型信息只存在于代碼編譯階段,但是在java的運(yùn)行期(已經(jīng)生成字節(jié)碼文件后)與泛型相關(guān)的信息會(huì)被擦除掉,專業(yè)術(shù)語叫做類型擦除。我們來看一個(gè)例子:

 
 
 
  1. ArrayList l1 = new ArrayList(); 
  2. ArrayList l2 = new ArrayList();  
  3. System.out.println(l1.getClass()==l2.getClass()); 

 運(yùn)行代碼,結(jié)果為True

這是因?yàn)锳rrayList 和ArrayList 在 jvm 中的 Class 都是 List.class,二者在 jvm 中等同于List 。

通過下面的例子我們做進(jìn)一步的分析

 
 
 
  1. import java.lang.reflect.Field; 
  2. public class GeneErasure { 
  3.    T object; 
  4.    public GeneErasure(T object) { 
  5.       this.object = object; 
  6.    } 
  7.    public static void main(String[] args) { 
  8.       GeneErasure demo = new GeneErasure("hi"); 
  9.       Class classz = demo.getClass(); 
  10.       System.out.println(classz.getName()); 
  11.       //輸出com.my.generic.GeneErasure 
  12.       Field[] fs = classz.getDeclaredFields(); 
  13.       for ( Field f:fs) { 
  14.         System.out.println("feild: "+f.getName()+"type:"+f.getType().getName()); 
  15.         //輸出feild: object type:java.lang.Object 
  16.       } 
  17.    } 

 通過這個(gè)例子我們可以看到Class 的類型仍然是GeneErasure并不是GeneErasure 這種形式,而類型T被替換成 Object 類型。接下來我們做另一個(gè)嘗試,把GeneErasure 更改為 GeneErasure < T extends String>

輸出結(jié)果為:

 
 
 
  1. feild: object type:java.lang.String 

所以,在泛型類被類型擦除的時(shí)候,之前泛型類中的類型參數(shù)部分如果沒有指定上限,如 則會(huì)被轉(zhuǎn)譯成普通的Object 類型,如果指定了上限,如 則類型參數(shù)就被替換成類型上限。

利用類型擦除干“壞事兒”

大家都知道,下面這段代碼l.add(123)無法編譯通過,因?yàn)?23不是String類型,這也是使用泛型的好處之一。

 
 
 
  1. ArrayList l=new ArrayList(); 
  2.  
  3. l.add("abc"); 
  4.  
  5. l.add(123); 

但是我們理解了泛型擦除的原理,我們可以巧妙地利用這個(gè)原理結(jié)合反射知識(shí)干一些“壞事”,例如:

 
 
 
  1. ArrayListl=new ArrayList(); 
  2.      l.add("abc");    
  3.      try { 
  4.        Method method = l.getClass().getDeclaredMethod("add",Object.class); 
  5.        method.invoke(l,"test"); 
  6.        method.invoke(l,100.f); 
  7.      }catch (Exception e) { 
  8.        e.printStackTrace(); 
  9.      } 
  10.      System.out.println("list的大小是:"+l.size());  
  11.      for ( Object o: l){ 
  12.        System.out.println(o); 
  13.      } 

 運(yùn)行結(jié)果是:

 
 
 
  1. list的大小是:3 
  2.  
  3. abc 
  4.  
  5. test 
  6.  
  7. 100.0(被成功插入到ArrayList中) 

我們可以看見100.0 成功地插入到ArrayList 中了,所以利用類型擦除的原理并結(jié)合反射的手段就繞過了正常開發(fā)中編譯器不允許的操作限制。

通俗的理解

我們可以將泛型比作是一個(gè)看守,他來守護(hù)我們的代碼安全,然后設(shè)置各項(xiàng)規(guī)定,“xxx 禁止出入”的提醒。而現(xiàn)實(shí)生活中,也總會(huì)有些人能夠基于對(duì)門衛(wèi)們生活作息的規(guī)律,繞開他們的監(jiān)視(反射結(jié)合泛型擦除)來干一些壞事兒 。


網(wǎng)頁題目:詳解Java泛型之十分鐘理解泛型擦除
路徑分享:http://www.5511xx.com/article/coedeed.html