Can you summarize the following document?
        
  泛型的定義主要有以下兩種:  不論使用哪個定義,泛型的引數在真正使用泛型時都必須作出指明。  一些強型別程式語言支援泛型,其主要目的是加強型別安全及減少類轉換的次數,但一些支援泛型的程式語言只能達到部分目的。

  在這例子中,codice_1是一個泛型,而codice_2是一個型別引數。在codice_1中沒指明codice_2的實際型別,只有codice_5和codice_6在使用codice_1時才加以指明。  執行這例子的codice_5將輸出整數5,而執行codice_6將輸出浮點數5.5。

  

  .NET 泛型的引數只可以代表類,不能代表個別物件。由於.NET 泛型的型別引數之實際型別在執行時均不會被消除,執行速度會因為型別轉換的次數減少而加快。另外,使用codice_10方法可於程式執行時得知泛型及其型別引數的實際型別,更可以運用反射程式設計。 .NET 允許對個別泛型的型別引數進行約束,包括以下幾種形式(假設codice_2是泛型的型別引數,codice_12是一般類、泛類,或是泛型的型別引數):

  Java 泛型的引數只可以代表類,不能代表個別物件。由於Java泛型的型別引數之實際型別在編譯時會被消除,所以無法在執行時得知其型別引數的型別,而且無法直接使用基本值型別作為泛型型別引數。Java編譯程式在編譯泛型時會自動加入型別轉換的編碼,故執行速度不會因為使用泛型而加快。  由於執行時會消除泛型的物件例項型別資訊等缺陷經常被人詬病,Java及JVM的開發方面也嘗試解決這個問題,例如Java通過在生成位元組碼時新增型別推導輔助資訊,從而可以通過反射介面獲得部分泛型資訊。通過改進泛型在JVM的實現,使其支援基本值型別泛型和直接獲得泛型資訊等。  Java允許對個別泛型的型別引數進行約束,包括以下兩種形式(假設codice_2是泛型的型別引數,codice_12是一般類、泛類,或是泛型的型別引數):

  C++ 泛型的引數可以代表類或個別物件。在一般意義上,C++ 缺乏對泛型的型別引數進行直接約束的手段,但可利用 SFINAE(模板代換失敗非錯誤,指在模板例項化過程中的錯誤僅意味此次代換失敗,並不一定產生編譯錯誤)規則及 C++11 的 static_assert 等實現相似功能。  class B{ }; class D: public B{ }; template<typename T> void SFINAE(const std::enable_if_t<std::is_base_of<B, T>::value, T> &t); template<typename T> void STATIC_ASSERT(const T &t){ 如上所示,std::enable_if(std::enable_if_t<boolean, Type> 是 std::enable_if<boolean, Type>::type 的縮寫)利用 SFINAE 規則來實現模板型別引數約束的手段之一。其實現方式是若布林判斷為假,則把型別設為 void,而這將導致 const void & 這種不合法的型別出現,從而禁止這種型別引數的使用。  static_assert 則在布林判斷失敗時把後面的字串作為訊息內容報告為編譯錯誤。  在編譯時,每個被使用的封閉泛型型別(即是所有泛型引數的實際型別都已被指明的泛型)都會有獨立的編碼產生,編譯程式會在此時確保型別安全性。可是如果泛型要運用其泛型引數的某成員,而該泛型引數又不包含該成員的時候,編譯程式所產生的錯誤資訊或會看似與實際問題無關,增加除錯的難度。
泛型程式設計(generic programming)是程式設計語言的一種風格或正規化。泛型允許程式設計師在強型別程式設計語言中編寫程式碼時使用一些以後才指定的型別,在例項化時作為引數指明這些型別。各種程式設計語言和其編譯器、執行環境對泛型的支援均不一樣。Ada、Delphi、Eiffel、Java、C#、F#、Swift 和 Visual Basic.NET 稱之為泛型(generics);ML、Scala 和 Haskell 稱之為引數多型(parametric polymorphism);C++ 和 D稱之為模板。具有廣泛影響的1994年版的《Design Patterns》一書稱之為引數化型別(parameterized type)。