JDK1.5中的泛型 - [Z]
不小心看到有人批判jdk1.5,先說java要強制轉(zhuǎn)型不好的問題沒解決,容器不能放基類型不好,接著說泛型沒用。而恰恰Jdk1.5中解決了這些問題,所以感嘆之余,把這篇文章改一下,詳細(xì)的說說泛型。
一,Java中的泛型:
在Java中能使用到泛型的多是容器類,如各種list map set,因為Java是單根繼承,所以容器里邊可以放的內(nèi)容是任何Object,所以從意義上講原本的設(shè)計才是泛型。但用過Java的人是否感覺每次轉(zhuǎn)型很麻煩呢? 而且會有些錯誤,比如一個容器內(nèi)放入了異質(zhì)對象,強制轉(zhuǎn)型的時候會出現(xiàn)cast異常。而這中錯誤在編譯器是
無從發(fā)現(xiàn)的。所以jdk1.5中提供了泛型,這個泛型其實是向c++靠攏了.好,我們先看幾個實例再細(xì)說原理。
二,泛型的用法:(多個實例)

2

3

4

5

6

7

8

9


2

3

4

5

6

7

8


2

3

4

5

6

7

8

三,看完了實例了,詳細(xì)來說說為什么吧
首先jdk1.5中的泛型,第一個解決的問題,就是Java中很多不必要的強制轉(zhuǎn)型了,具體的實現(xiàn),我們以ArrayList
為例,下邊是ArrayList中的片斷代碼:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

四,Boxing 和UnBoxing
看到上邊的關(guān)鍵點(3)和(4)是否感覺驚奇呢,因為Java中煩人的除了強制轉(zhuǎn)型,另一個就是基礎(chǔ)類型了
放入容器的時候要包裝,取出了還要轉(zhuǎn)回。Jdk1.5中解決了這個問題.如上邊的使用方法
五,泛型的生命周期(使用注意事項)
如果我們試著把ArrayList<String> list的內(nèi)容序列化,然後再讀取出來,在使用的過程中會發(fā)現(xiàn)出錯,
為什么呢?用Stream讀取一下回來的數(shù)據(jù),你會發(fā)現(xiàn)<String>不見了,list變成了普通的ArrayList,而不是
參數(shù)化型別的ArrayList了,為什么會這樣呢 ?見下邊的比較
六,C++的泛型和Java的泛型
在泛型的實現(xiàn)上,C++和Java有著很大的不同,
Java是擦拭法實現(xiàn)的
C++是膨脹法實現(xiàn)的
因為Java原本實現(xiàn)就是泛型的,現(xiàn)在加入型別,其實是"窄化",所以采用擦拭法,在實現(xiàn)上,其實是封裝了原本的
ArrayList,這樣的話,對于下邊這些情況,Java的實現(xiàn)類只有一個。


2


3


4

5

6

7

這就造成了,在序列化后,Java不能分清楚原來的ArrayList是
ArrayList<Integer>還是ArrayList
七,題外話,在很多東西的實現(xiàn)上C++和Java有很多不同
例如運算符的問題i=i++問題,詳細(xì)看這里
例如在C++中能很好實現(xiàn)的double-checked locking單態(tài)模式,在Java中幾乎很難實現(xiàn) 詳細(xì)看這里
還有就是上邊提到的泛型實現(xiàn)上。
八,Jdk 1.5加入了不少新東西,有些能很大的提高開發(fā)質(zhì)量,例如Jdk1.4 ,Jdk.15中StringBuffer的不同
因為從1。4轉(zhuǎn)入1。5不久,所以慢慢會發(fā)一些在1。5的使用過程中發(fā)現(xiàn)的東西。
最后,我們還可以自己寫類似ArrayList這樣的泛型類,至于如何自定義泛型類,泛型方法請參見候捷先生的文章