http://blog.csdn.net/hujinpu
大家先看看下面這段小程序
?
編譯器報錯,說無法將Product中的prt(java.util.List<java.lang.String>)應用于(java.util.List<java.lang.Integer>)。前面定義了List<Integer> list = new ArrayList<Integer>();后面卻調用 public void prt(List<String> lt)用list做參數,肯定是錯誤的用法。編譯器報錯的行為是很正確的,他幫助你避免了潛在錯誤的發生。這里要注意泛型的作用:List<Integer>和List<String>雖然看著都是List,但編譯器把他們當作不同的class,不能相互替代。這是泛型的基本原則。你可以把他們看成一個是Class1, 一個是Class2, 當然不能給一個需要類型為Class1的參數的方法傳一個類型為Class2的參數的方法啦。
再來看上面程序稍微改動一處的情況
編譯器說使用了未經檢查或不安全的操作,但能編譯通過并運行顯示 [1, 2]。
這又是為什么呢?就是紅色的那一個<T>就變化這么大嗎?似乎不是和剛才效果應該一樣拉,怎么這回又可以了?
原因是這樣的:第次程序里面,只是把class Product改成了class Product<T>,盡管類型T在Product的代碼里壓根從沒用到,但是這個定義把一個普通類(class)變成了原始類型(raw class)。generic class Product<T>在JVM運行時是不存在的,Product這個原始類型不是類型安全的。因為在new Product.prt(list)里面,使用的是原始類型的Product,所以里面的list也會被擦拭成原始類型的,所以類型就符合了,不會有編譯錯誤而可以運行。
雖然這個時候程序盡管可以運行,但其使用泛型的方法,無疑是錯誤的。 在這里我只是想和大家分析一些泛型的細節問題。要大家通過這個細節明白泛型的細節之處(檫試,原始類型)。具體的內容我就不在說了,很多書都有。推薦java參考大全5edition page264 和 core Java I 7edition Chapter 13. Generic Programming??
Powered by: BlogJava Copyright © livahu