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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
詳解泛型與類型轉(zhuǎn)換

Java 5.0引入泛型以后,提高了類型安全性,然而也給編程帶來(lái)了新的挑戰(zhàn)以及新的誤區(qū),類型轉(zhuǎn)換就是一個(gè)很好的例子。引入泛型以后,對(duì)象的類型似乎由兩個(gè)類型構(gòu)成:集合類型和參數(shù)類型,例如List list = new LinkedList (),似乎list的類型由List和Integer共同決定。如果真是這樣,那么我們?nèi)绻M麑?duì)list進(jìn)行類型轉(zhuǎn)換,我們?cè)撛趺崔k?是對(duì)List轉(zhuǎn)換,還是對(duì)Integer轉(zhuǎn)換?要解答上面的問(wèn)題很簡(jiǎn)單,編寫如下的代碼,運(yùn)行之就可看出端倪:

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的仙居網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

 
 
 
  1. public   static   void  wrongConversion()   {  
  2.         List < Integer >  list  =   new  LinkedList < Integer > ();  
  3.         list.add( 1 );  
  4.         list.add( 2 );  
  5.         list.add( 3 );  
  6.           
  7.          // 下面的代碼無(wú)法編譯通過(guò)。  
  8.          // List  wrongList = list;   
  9.            
  10.     }   
  11.       
  12.      public   static   void  rightConversion()   {  
  13.         LinkedList < Integer >  list  =   new  LinkedList < Integer > ();  
  14.         list.add( 10 );  
  15.         list.add( 20 );  
  16.         list.add( 30 );  
  17.           
  18.         List < Integer >  rightList  =  list;  
  19.          for ( int  number: rightList)   {  
  20.             System.out.println(number);  
  21.         }   
  22.           
  23.     }  

如果你運(yùn)行上面的代碼,你會(huì)發(fā)現(xiàn)前一個(gè)函數(shù)根本無(wú)法通過(guò)編譯,而后一個(gè)函數(shù)不僅編譯成功,而且能得到正確結(jié)果。這似乎給出了一個(gè)結(jié)論:對(duì)象的類型由集合類型來(lái)決定,對(duì)對(duì)象進(jìn)行類型轉(zhuǎn)換時(shí)也是對(duì)集合類型進(jìn)行轉(zhuǎn)換。事實(shí)確實(shí)如此!那么為什么會(huì)如此呢?

我們可以回憶一下以前我們對(duì)參數(shù)類型的描述:參數(shù)類型不過(guò)是一個(gè)占位符而已,在編譯時(shí),它會(huì)被具體的類型代替,同時(shí)對(duì)添加到集合對(duì)象中的數(shù)據(jù)進(jìn)行參數(shù)檢查;如果添加到對(duì)象中的數(shù)據(jù)類型不是指定的具體類型或其子類型,則編譯出錯(cuò);而且,編譯以后,該占位符會(huì)被移除,運(yùn)行時(shí)你是無(wú)法得到任何集合類型中數(shù)據(jù)的類型信息的。簡(jiǎn)而言之:

List strings = new LinkedList ( );

List ints = new LinkedList ( );

上面的代碼在運(yùn)行時(shí)和

List strings = new LinkedList( );

List ints = new LinkedList( );

毫無(wú)二致。了解了這一點(diǎn)以后,相信我們對(duì)于類型轉(zhuǎn)換也會(huì)有更深的理解了。

泛型給我們帶來(lái)了好處,使我們?cè)诰幾g時(shí)就能發(fā)現(xiàn)很多錯(cuò)誤;然而任何事物都是柄雙刃劍,泛型也不例外。泛型的缺點(diǎn)最明顯之處就在于類型轉(zhuǎn)換。如果你讀過(guò)前面的文章,肯定看到過(guò)不帶參數(shù)類型的集合對(duì)象轉(zhuǎn)換為帶參數(shù)類型的集合對(duì)象,其實(shí)不僅僅如此,這兩者之間可以任意轉(zhuǎn)換。這就意味著一點(diǎn),我們不僅可以對(duì)集合類型進(jìn)行轉(zhuǎn)換,也可以對(duì)參數(shù)類型進(jìn)行任意的轉(zhuǎn)換。這似乎與前面的描述不符,因?yàn)樯厦娴拇a中的List wrongList = list;根本無(wú)法編譯通過(guò)。確實(shí)如此,這行代碼確實(shí)無(wú)法編譯通過(guò),不過(guò)我們中間做一步處理以后,上面的轉(zhuǎn)換就可以正常編譯了:

List mediaList = list;

List wrongList = mediaList;

由此可見(jiàn),泛型在給我們帶來(lái)好處的同時(shí),也帶來(lái)了無(wú)數(shù)陷阱,我們?cè)诰幊虝r(shí)需十分注意,而Java的泛型機(jī)制也需要不斷更新。

最后和以往一樣,以一個(gè)拙劣的程序結(jié)束本文:

上面程序的輸出結(jié)果為:

 
 
 
  1. rightConversion  
  2. 10 
  3. 20 
  4. 30 
  5. badConversion  
  6. java.lang.ClassCastException: java.lang.String  
  7.     at com.jiang.tiger.chap1.GenericReflection.fillList(GenericReflection.java:11)  
  8.     at com.jiang.tiger.chap1.GenericReflection.badConversion(GenericReflection.java:32)  
  9.     at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:109)  
  10. badConversion2  
  11. java.lang.ClassCastException: java.lang.String  
  12.     at com.jiang.tiger.chap1.GenericReflection.badConversion2(GenericReflection.java:45)  
  13.     at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:116)  
  14. wrongConversion  
  15. 100 
  16. 200 
  17. 300 
  18. java.lang.ClassCastException: java.lang.Double  
  19.     at com.jiang.tiger.chap1.GenericReflection.wrongConversion(GenericReflection.java:62)  
  20.     at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:123)  
  21. badReflection  
  22. Filling list and printing in normal way  
  23. java.lang.ClassCastException: java.lang.String  
  24.     at com.jiang.tiger.chap1.GenericReflection.printList(GenericReflection.java:17)  
  25.     at com.jiang.tiger.chap1.GenericReflection.badReflection(GenericReflection.java:99)Printing with illegal values in list  
  26.  
  27.     at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:130)  

【編輯推薦】

  1. Java泛型的理解與等價(jià)實(shí)現(xiàn)
  2. Java泛型編程快速入門
  3. 淺談關(guān)于C#、Java泛型的看法
  4. 在Java中定義自己的工具庫(kù)
  5. Java技術(shù)在協(xié)同軟件中的應(yīng)用

分享標(biāo)題:詳解泛型與類型轉(zhuǎn)換
網(wǎng)頁(yè)地址:http://www.5511xx.com/article/cdjsjge.html