大家先看看下面這段小程序


























?
編譯器報(bào)錯(cuò),說(shuō)無(wú)法將Product中的prt(java.util.List<java.lang.String>)應(yīng)用于(java.util.List<java.lang.Integer>)。前面定義了List<Integer> list = new ArrayList<Integer>();后面卻調(diào)用 public void prt(List<String> lt)用list做參數(shù),肯定是錯(cuò)誤的用法。編譯器報(bào)錯(cuò)的行為是很正確的,他幫助你避免了潛在錯(cuò)誤的發(fā)生。這里要注意泛型的作用:List<Integer>和List<String>雖然看著都是List,但編譯器把他們當(dāng)作不同的class,不能相互替代。這是泛型的基本原則。你可以把他們看成一個(gè)是Class1, 一個(gè)是Class2, 當(dāng)然不能給一個(gè)需要類(lèi)型為Class1的參數(shù)的方法傳一個(gè)類(lèi)型為Class2的參數(shù)的方法啦。
再來(lái)看上面程序稍微改動(dòng)一處的情況


























編譯器說(shuō)使用了未經(jīng)檢查或不安全的操作,但能編譯通過(guò)并運(yùn)行顯示 [1, 2]。
這又是為什么呢?就是紅色的那一個(gè)<T>就變化這么大嗎?似乎不是和剛才效果應(yīng)該一樣拉,怎么這回又可以了?
原因是這樣的:第次程序里面,只是把class Product改成了class Product<T>,盡管類(lèi)型T在Product的代碼里壓根從沒(méi)用到,但是這個(gè)定義把一個(gè)普通類(lèi)(class)變成了原始類(lèi)型(raw class)。generic class Product<T>在JVM運(yùn)行時(shí)是不存在的,Product這個(gè)原始類(lèi)型不是類(lèi)型安全的。因?yàn)樵趎ew Product.prt(list)里面,使用的是原始類(lèi)型的Product,所以里面的list也會(huì)被擦拭成原始類(lèi)型的,所以類(lèi)型就符合了,不會(huì)有編譯錯(cuò)誤而可以運(yùn)行。
雖然這個(gè)時(shí)候程序盡管可以運(yùn)行,但其使用泛型的方法,無(wú)疑是錯(cuò)誤的。 在這里我只是想和大家分析一些泛型的細(xì)節(jié)問(wèn)題。要大家通過(guò)這個(gè)細(xì)節(jié)明白泛型的細(xì)節(jié)之處(檫試,原始類(lèi)型)。具體的內(nèi)容我就不在說(shuō)了,很多書(shū)都有。推薦java參考大全5edition page264 和 core Java I 7edition Chapter 13. Generic Programming??