JAVA的泛型和C++的模板的區別與聯繫

總結一下java的泛型編程和c++模板的區別和聯繫。

泛型本質上是提供類型的"類型參數",它們也被稱爲參數化類型(parameterized type)或參量多態(parametric polymorphism)。其實泛型思想並不是 Java 最先引入的,C++ 中的模板就是一個運用泛型的例子。

曾經有面試官問我JDK1.4和JDK1.5有一些什麼不同,變化最大的是什麼。

由於我開始學習java的時候已經jdk1.5了,所以並不瞭解。Java SE 5.0中增加了泛型機制,主要原因是滿足1999年指定的最早的java規範需求,專家組花費了5年左右的時間用來定義規範和測試實現。

     泛型程序設計劃分爲三個熟練地級別。

     

1,java中沒有template的關鍵字,c++中有

2,Java 語言中的泛型不能接受基本類型作爲類型參數――它只能接受引用類型。這意味着可以定義 List<Integer>,但是不可以定義 List<int>。

3,在java中,尖括號通常放在方法名前,而c++則是放在方法名後,c++的方式容易產生歧義,例如g(f<a,b>(c)),這個則有兩種解釋,一種是f的泛型調用,c爲參數,a,b爲泛型參數。另一種解釋,則是,g調用,兩個bool類型的參數。

4,在 C++ 模板中,編譯器使用提供的類型參數來擴充模板,因此,爲 List<A> 生成的 C++ 代碼不同於爲 List<B> 生成的代碼,List<A> 和 List<B> 實際上是兩個不同的類。而 Java 中的泛型則以不同的方式實現,編譯器僅僅對這些類型參數進行擦除和替換。類型 ArrayList<Integer> 和 ArrayList<String> 的對象共享相同的類,並且只存在一個 ArrayList 類。因此在c++中存在爲每個模板的實例化產生不同的類型,這一現象被稱爲“模板代碼膨脹”,而java則不存在這個問題的困擾。java中虛擬機中沒有泛型,只有基本類型和類類型,泛型會被擦除,一般會修改爲Object,如果有限制,例如 T extends Comparable,則會被修改爲Comparable。而在C++中不能對模板參數的類型加以限制,如果程序員用一個不適當的類型實例化一個模板,將會在模板代碼中報告一個錯誤信息。

發佈了50 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章