成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解泛型與類型轉(zhuǎn)換

開發(fā) 后端
Java 5.0引入泛型以后,提高了類型安全性,然而也給編程帶來了新的挑戰(zhàn)以及新的誤區(qū),類型轉(zhuǎn)換就是一個很好的例子。

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

 

  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.          // 下面的代碼無法編譯通過。  
  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.     }  

 

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

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

List strings = new LinkedList( );

List ints = new LinkedList( );

上面的代碼在運行時和

List strings = new LinkedList( );

List ints = new LinkedList( );

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

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

List mediaList = list;

List wrongList = mediaList;

由此可見,泛型在給我們帶來好處的同時,也帶來了無數(shù)陷阱,我們在編程時需十分注意,而Java的泛型機制也需要不斷更新。

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

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

 

  1. rightConversion  
  2. 10 
  3. 20 
  4. 30 
  5. badConversion  
  6. 1 
  7. 2 
  8. 3 
  9. java.lang.ClassCastException: java.lang.String  
  10.     at com.jiang.tiger.chap1.GenericReflection.fillList(GenericReflection.java:11)  
  11.     at com.jiang.tiger.chap1.GenericReflection.badConversion(GenericReflection.java:32)  
  12.     at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:109)  
  13. badConversion2  
  14. 1 
  15. 2 
  16. java.lang.ClassCastException: java.lang.String  
  17.     at com.jiang.tiger.chap1.GenericReflection.badConversion2(GenericReflection.java:45)  
  18.     at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:116)  
  19. wrongConversion  
  20. 100 
  21. 200 
  22. 300 
  23. java.lang.ClassCastException: java.lang.Double  
  24.     at com.jiang.tiger.chap1.GenericReflection.wrongConversion(GenericReflection.java:62)  
  25.     at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:123)  
  26. badReflection  
  27. Filling list and printing in normal way  
  28. 1 
  29. 2 
  30. 3 
  31. 1 
  32. 2 
  33. 3 
  34. 4 
  35. 5 
  36. 6 
  37. java.lang.ClassCastException: java.lang.String  
  38.     at com.jiang.tiger.chap1.GenericReflection.printList(GenericReflection.java:17)  
  39.     at com.jiang.tiger.chap1.GenericReflection.badReflection(GenericReflection.java:99)Printing with illegal values in list  
  40. 1 
  41. 2 
  42. 3 
  43. 1 
  44. 2 
  45. 3 
  46. 4 
  47. 5 
  48. 6 
  49.  
  50.     at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:130)  

【編輯推薦】

  1. Java泛型的理解與等價實現(xiàn)
  2. Java泛型編程快速入門
  3. 淺談關于C#、Java泛型的看法
  4. 在Java中定義自己的工具庫
  5. Java技術在協(xié)同軟件中的應用
責任編輯:金賀 來源: ITEYE博客
相關推薦

2009-08-24 14:20:13

C# 強制類型轉(zhuǎn)換

2010-01-20 18:22:37

VB.NET泛型類型

2021-06-18 08:25:42

Java泛型通配符

2024-10-28 00:40:49

Go語法版本

2009-08-24 13:52:04

C# 泛型約束

2009-07-30 14:00:21

ASP.NET 2.0

2011-03-21 16:26:28

java泛型

2023-04-10 16:34:45

編程Java開發(fā)

2009-04-24 09:33:12

LINQ查詢非泛型

2009-08-24 14:51:25

C# 泛型泛型類型

2023-03-24 15:53:24

JavaJava 泛型開發(fā)

2009-09-08 16:36:10

LINQ查詢基于泛型類

2022-06-19 22:54:08

TypeScript泛型工具

2021-06-17 06:51:32

Java泛型Java編程

2025-01-13 07:00:00

Java泛型編程

2021-07-01 06:47:30

Java泛型泛型擦除

2009-08-24 18:22:05

C# 泛型編程

2024-10-22 16:59:07

2024-11-05 09:11:09

TypeScript開發(fā)者代碼

2013-03-20 09:27:33

C#泛型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品资源在线 | av一区二区三区在线观看 | 亚洲狠狠爱 | 欧美一级欧美一级在线播放 | 欧美一区二区三区在线观看 | 96国产精品久久久久aⅴ四区 | 国产免费黄网 | 毛片高清| 欧美一区在线看 | 精品国产一区二区三区在线观看 | 伊人啪啪网 | 欧美日韩高清 | 91精品一区二区三区久久久久久 | 黄色片网站国产 | 久色视频在线 | 久久电影一区 | 欧美视频免费在线 | 亚洲综合精品 | 国产一区999 | 精品国产一级片 | 精品中文在线 | 蜜桃一区二区三区在线 | 欧美黄在线观看 | 中文字幕在线三区 | 国产一区二区在线视频 | 欧美 视频 | 日一区二区| 韩日在线视频 | 99精品一区二区三区 | 午夜爱爱毛片xxxx视频免费看 | 日韩在线免费视频 | 日本精品视频在线观看 | 成人福利在线观看 | 久久精品欧美一区二区三区不卡 | 色综合视频 | 天天人人精品 | 国产高清精品一区二区三区 | 欧美成人猛片aaaaaaa | 久久久久久一区 | 亚洲日韩中文字幕一区 | 久久精品亚洲国产 |