C++ 中的泛型
先前我撰寫 C++ 時,還沒有泛型(Generic types)的字眼出現,最多是使用 template 來達成對不同型別的支援。像是:不過在 C++ STL (Standard Template Library) 出現,各個 C++ 編譯器相繼支援後,泛型一詞才在資訊界中廣為流傳。STL 提供了字串、容器、演算法等眾多功能,使得 C++ 增色不少,其中泛型是相當重要的概念。無論是各種類別,都可以放在容器之中,並且使用演算法函式庫來處理。例如:C++ 有泛型的出現,很大一個原因是為了要處理各種不同的型別,包括了 STL 中新增和使用者自行定義的部份。和 C++ 不同的是,Java 一開始並沒有這樣的設計,因為 Java 所有的物件都有共同的祖先:java.lang.Object,所以 Java 中的函式若要處理多型別時,只需適當地定義參數和(或)傳回值為 Object 即可,這正是多型的徹底應用之一。反之 C++ 中的類別沒有這關的關係,因此泛型在 C++ 中就顯得特別重要。不過在這邊有些缺點。因為 C++ 的泛型是使用 template 來達成的,而 template 會在遇到不同型別時產生相對應的副本。例如 Type add(Type t, Type s) 這項函式定義會在 add(4, 1) 時出現 int add(int, int) 的程式碼,並在 add(1.1, 2.2) 時出現 float add(float, float) 的程式碼,也就是整個整式因為這個關係,而變得愈來愈肥大。Java 中的泛型
Java 1.5 中已經支援泛型了。目前主要在 java.util 中的類別有比較多的例子,另外還有在 java.lang.Comparable, java.lang.Class, java.lang.Enum 及其相關類別。底下是用 List 和 Vector 來測試泛型:執行結果:6-5-4-3-2-1-泛型在此所帶來的好處是只要在宣告時我們指定好類別,那麼接下來後面的程式中它會自動幫我們轉型,並且也會檢查後續加入容器中的物件是否可轉型成我們指定的類別。上例中,如果增加一行 list.add("test"); ,那麼在編譯時就會出現錯誤,會說 cannot find symbol : method add(java.lang.String)。這使得原本放在執行階段才會檢查出來的問題,提昇到了編譯時期。降低了 bug 出現的機會,也讓程式設計師在除錯上方便許多。另外 Java 使用動態連結技術,並且有共同的 Object 祖先做為最根本的多型,因此並不需要像 C++ 一樣,為每一個型別產生不同的程式碼副本。
泛型中使用多型
List<Integer> 中的 Integer 其實可以看成是欲放入容器中物件的類別,因此接下來的 add() 和 get() 都會將其傳入值和傳回值轉型成其類別。所以我們也可以將多型運用在這上面,例如:執行結果:0:Super
1:Sub
2:Super
3:Sub
唱歌看書研究,程式小說新詩。搞了個Blog和古文網站,寫些亂七八糟及翻譯文章,玩些小程式和中文化。可惜時間美好人生苦短,沒法一一盡善。夢想是開間小 pub,放喜歡的音樂,喝自己調的酒。
針對 css 支援極差的 IE 可能會無法正常瀏覽本站,強烈建議 















