|名詞定義|
Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時類型安全檢測機制,該機制允許程式員在編譯時檢測到非法的類型。
泛型的本質是參數化類型,也就是說所操作的資料類型被指定為一個參數。類中的屬性或方法的參數與傳回值的類型可以由對象執行個體化的時候動态決定。
|特點|
你可以寫一個泛型方法,該方法在調用時可以接收不同類型的參數。根據傳遞給泛型方法的參數類型,編譯器适當地處理每一個方法調用。
下面是定義泛型方法的規則:
• 所有泛型方法聲明都有一個類型參數聲明部分(由尖括号分隔),該類型參數聲明部分在方法傳回類型之前。
• 每一個類型參數聲明部分包含一個或多個類型參數,參數間用逗号隔開。一個泛型參數,也被稱為一個類型變量,是用于指定一個泛型類型名稱的辨別符。
• 類型參數能被用來聲明傳回值類型,并且能作為泛型方法得到的實際參數類型的占位符。
• 泛型方法體的聲明和其他方法一樣。注意類型參數隻能代表引用型類型,不能是原始類型(像int,double,char的等)。
泛型方法
在之前的程式類裡實際上已經可以發現在泛型類之中如果将泛型标記寫在方法上,那麼這樣的方法就被稱為泛型方法,但是需要注意的是,泛型方法不一定非要出現在泛型類中。即:如果一個類上沒有定義泛型,也能使用泛型方法。
泛型通配符
泛型通配符一般是使用?代替具體的類型參數。
|拓展資料|
NET 的泛型
.NET 泛型的參數隻可以代表類,不能代表個别對象。由于 .NET 泛型的類型參數之實際類型在運作時均不會被消除,運作速度會因為類型轉換的次數減少而加快。另外,使用GetType()方法可于程式運作時得知泛型及其類型參數的實際類型,更可以運用反射程式設計。
.NET 允許對個别泛型的類型參數進行限制,包括以下幾種形式[1](假設T是泛型的類型參數,C是一般類、泛類,或是泛型的類型參數):
T是一個類。
T是一個值類型。
T具有無參數的公有建構方法。
T實作接口I。
T是C,或繼承自C。
Java 的泛型
Java 泛型的參數隻可以代表類,不能代表個别對象。由于Java泛型的類型參數之實際類型在編譯時會被消除,是以無法在運作時得知其類型參數的類型,而且無法直接使用基本值類型作為泛型類型參數。Java編譯程式在編譯泛型時會自動加入類型轉換的編碼,故運作速度不會因為使用泛型而加快。
由于運作時會消除泛型的對象執行個體類型資訊等缺陷經常被人诟病,Java及JVM的開發方面也嘗試解決這個問題,例如Java通過在生成位元組碼時添加類型推導輔助資訊,進而可以通過反射接口獲得部分泛型資訊。通過改進泛型在JVM的實作,使其支援基本值類型泛型和直接獲得泛型資訊等。
Java允許對個别泛型的類型參數進行限制,包括以下兩種形式[2](假設T是泛型的類型參數,C是一般類、泛類,或是泛型的類型參數):
C++的泛型
C++ 泛型的參數可以代表類或個别對象。在一般意義上,C++ 缺乏對泛型的類型參數進行直接限制的手段,但可利用 SFINAE(模闆代換失敗非錯誤,指在模闆執行個體化過程中的錯誤僅意味此次代換失敗,并不一定産生編譯錯誤)規則及 C++11 的 static_assert 等實作相似功能。
|參考資料|
[1] 阿裡雲大學Java視訊課程
[2] Java開發者
[3] Java教程
[4] 維基百科