詳解泛型與類型轉(zhuǎn)換
Java 5.0引入泛型以后,提高了類型安全性,然而也給編程帶來了新的挑戰(zhàn)以及新的誤區(qū),類型轉(zhuǎn)換就是一個很好的例子。引入泛型以后,對象的類型似乎由兩個類型構(gòu)成:集合類型和參數(shù)類型,例如List
- public static void wrongConversion() {
 - List < Integer > list = new LinkedList < Integer > ();
 - list.add( 1 );
 - list.add( 2 );
 - list.add( 3 );
 - // 下面的代碼無法編譯通過。
 - // List
 wrongList = list; - }
 - public static void rightConversion() {
 - LinkedList < Integer > list = new LinkedList < Integer > ();
 - list.add( 10 );
 - list.add( 20 );
 - list.add( 30 );
 - List < Integer > rightList = list;
 - for ( int number: rightList) {
 - System.out.println(number);
 - }
 - }
 
如果你運行上面的代碼,你會發(fā)現(xiàn)前一個函數(shù)根本無法通過編譯,而后一個函數(shù)不僅編譯成功,而且能得到正確結(jié)果。這似乎給出了一個結(jié)論:對象的類型由集合類型來決定,對對象進行類型轉(zhuǎn)換時也是對集合類型進行轉(zhuǎn)換。事實確實如此!那么為什么會如此呢?
我們可以回憶一下以前我們對參數(shù)類型的描述:參數(shù)類型不過是一個占位符而已,在編譯時,它會被具體的類型代替,同時對添加到集合對象中的數(shù)據(jù)進行參數(shù)檢查;如果添加到對象中的數(shù)據(jù)類型不是指定的具體類型或其子類型,則編譯出錯;而且,編譯以后,該占位符會被移除,運行時你是無法得到任何集合類型中數(shù)據(jù)的類型信息的。簡而言之:
List
List
上面的代碼在運行時和
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
List mediaList = list;
List
由此可見,泛型在給我們帶來好處的同時,也帶來了無數(shù)陷阱,我們在編程時需十分注意,而Java的泛型機制也需要不斷更新。
最后和以往一樣,以一個拙劣的程序結(jié)束本文:
上面程序的輸出結(jié)果為:
- rightConversion
 - 10
 - 20
 - 30
 - badConversion
 - 1
 - 2
 - 3
 - java.lang.ClassCastException: java.lang.String
 - at com.jiang.tiger.chap1.GenericReflection.fillList(GenericReflection.java:11)
 - at com.jiang.tiger.chap1.GenericReflection.badConversion(GenericReflection.java:32)
 - at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:109)
 - badConversion2
 - 1
 - 2
 - java.lang.ClassCastException: java.lang.String
 - at com.jiang.tiger.chap1.GenericReflection.badConversion2(GenericReflection.java:45)
 - at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:116)
 - wrongConversion
 - 100
 - 200
 - 300
 - java.lang.ClassCastException: java.lang.Double
 - at com.jiang.tiger.chap1.GenericReflection.wrongConversion(GenericReflection.java:62)
 - at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:123)
 - badReflection
 - Filling list and printing in normal way
 - 1
 - 2
 - 3
 - 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - java.lang.ClassCastException: java.lang.String
 - at com.jiang.tiger.chap1.GenericReflection.printList(GenericReflection.java:17)
 - at com.jiang.tiger.chap1.GenericReflection.badReflection(GenericReflection.java:99)Printing with illegal values in list
 - 1
 - 2
 - 3
 - 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - at com.jiang.tiger.chap1.GenericReflection.main(GenericReflection.java:130)
 
【編輯推薦】















 
 
 






 
 
 
 