.NET Framework 的泛型
泛型是具有占位符(類型參數)的類、結構、接口和方法,這些占位符是類、結構、接口和方法所存儲或使用的壹個或多個類型的占位符。泛型集合類可以將類型參數用作它所存儲的對象的類型的占位符;類型參數作為其字段的類型及其方法的參數類型出現。泛型方法可以將其類型參數用作其返回值的類型或者其某個形參的類型。
由於.NET Framework 泛型的類型參數之實際類型在運行時均不會被消除,運行速度會因為類型轉換的次數減少而加快。
另外,使用 GetType 方法可於程序運行時得知泛型及其類型參數的實際類型,更可以運用反射編程。
允許對個別泛型的類型參數進行約束,包括以下幾種形式(假設 C是泛型的類型參數, 是壹般類、泛類,或是泛型的類型參數):T 是壹個類。T 是壹個值類型。T 具有無參數的公有建構方法。T 實現接口 I 。T 是 C ,或繼承自 C 。
Java 的泛型
Java 泛型的參數只可以代表類,不能代表個別對象。由於 Java 泛型的類型參數之實際類型在編譯時會被消除,所以無法在運行時得知其類型參數的類型。Java 編譯器在編譯泛型時會自動加入類型轉換的編碼,故運行速度不會因為使用泛型而加快。Java 允許對個別泛型的類型參數進行約束,包括以下兩種形式(假設 T 是泛型的類型參數,C 是壹般類、泛類,或是泛型的類型參數):T 實現接口 I 。T 是 C ,或繼承自 C 。壹個泛型類不能實現Throwable接口。
C++ 的泛型(模板)
C++ 無法對泛型的類型參數進行約束。在編譯時,每個被使用的封閉泛型類型(即是所有泛型參數的實際類型都已被指明的泛型)都會有獨立的編碼產生,編譯器會在此時確保類型安全性。可是如果泛型要運用其泛型參數的某成員,而該泛型參數又不包含該成員的時候,編譯器所產生的錯誤信息會看似與實際問題無關,增加出錯的難度。