Java中的泛型和C++中的泛型,也就是C++中的模板類(lèi)和模板函數(shù)等等,有著本質(zhì)的不同.
GJ (Generic Java)是對(duì) Java 語(yǔ)言的一種擴(kuò)展,是一種帶有參數(shù)化類(lèi)型的 Java 語(yǔ)言。用 GJ 編寫(xiě)的程序看起來(lái)和普通的 Java 程序基本相同,只不過(guò)多了一些參數(shù)化的類(lèi)型同時(shí)少了一些類(lèi)型轉(zhuǎn)換。實(shí)際上,這些 GJ 程序也是首先被轉(zhuǎn)化成一般的不帶泛型的 Java 程序后再進(jìn)行處理的,編譯器自動(dòng)完成了從 Generic Java 到普通 Java 的翻譯。
GJ 程序的語(yǔ)法在表面上與 C++ 中的模板非常類(lèi)似,但是二者之間有著本質(zhì)的區(qū)別。
首先,Java 語(yǔ)言中的泛型不能接受基本類(lèi)型作為類(lèi)型參數(shù)――它只能接受引用類(lèi)型。這意味著可以定義 List<Integer>,但是不可以定義 List<int>。
其 次,在 C++ 模板中,編譯器使用提供的類(lèi)型參數(shù)來(lái)擴(kuò)充模板,因此,為 List<A> 生成的 C++ 代碼不同于為 List<B> 生成的代碼,List<A> 和 List<B> 實(shí)際上是兩個(gè)不同的類(lèi)。而 Java 中的泛型則以不同的方式實(shí)現(xiàn),編譯器僅僅對(duì)這些類(lèi)型參數(shù)進(jìn)行擦除和替換。類(lèi)型 ArrayList<Integer> 和 ArrayList<String> 的對(duì)象共享相同的類(lèi),并且只存在一個(gè) ArrayList 類(lèi)。