複製鏈接
請複製以下鏈接發送給好友

泛型

鎖定
泛型程序設計(generic programming)是程序設計語言的一種風格或範式。泛型允許程序員在強類型程序設計語言中編寫代碼時使用一些以後才指定的類型,在實例化時作為參數指明這些類型。各種程序設計語言和其編譯器、運行環境對泛型的支持均不一樣。Ada、Delphi、EiffelJavaC#F#SwiftVisual Basic .NET 稱之為泛型(generics);ML、Scala 和 Haskell 稱之為參數多態(parametric polymorphism);C++D稱之為模板。具有廣泛影響的1994年版的《Design Patterns》一書稱之為參數化類型(parameterized type)。
中文名
泛型
外文名
genericity
類    別
程序設計語言的一種特性
適用範圍
計算機

泛型簡介

泛型程序設計(generic programming)是程序設計語言的一種風格或範式。泛型允許程序員在強類型程序設計語言中編寫代碼時使用一些以後才指定的類型,在實例化時作為參數指明這些類型。各種程序設計語言和其編譯器、運行環境對泛型的支持均不一樣。Ada、Delphi、EiffelJavaC#F#SwiftVisual Basic .NET稱之為泛型(generics);ML、Scala和Haskell稱之為參數多態(parametric polymorphism);C++D稱之為模板。具有廣泛影響的1994年版的《Design Patterns》一書稱之為參數化類型(parameterized type)。 [1] 

泛型泛型的定義及目的

泛型的定義主要有以下兩種:
  1. 在程序編碼中一些包含類型參數的類型,也就是説泛型的參數只可以代表類,不能代表個別對象。(這是當今較常見的定義)
  2. 在程序編碼中一些包含參數的。其參數可以代表類或對象等等。(現在人們大多把這稱作模板
不論使用哪個定義,泛型的參數在真正使用泛型時都必須作出指明。
一些強類型程序語言支持泛型,其主要目的是加強類型安全及減少類轉換的次數,但一些支持泛型的程序語言只能達到部分目的。 [1] 

泛型一些程序語言的泛型特性

泛型.NET 的泛型

.NET泛型的參數只可以代表類,不能代表個別對象。由於 .NET 泛型的類型參數之實際類型在運行時均不會被消除,運行速度會因為類型轉換的次數減少而加快。另外,使用GetType()方法可於程序運行時得知泛型及其類型參數的實際類型,更可以運用反射編程。
.NET 允許對個別泛型的類型參數進行約束,包括以下幾種形式(假設T是泛型的類型參數,C是一般類、泛類,或是泛型的類型參數):
  • T是一個類。
  • T是一個值類型。
  • T具有無參數的公有建構方法。
  • T實現接口I。
  • T是C,或繼承自C。

泛型Java 的泛型

參見:Java
Java 泛型的參數只可以代表類,不能代表個別對象。由於Java泛型的類型參數之實際類型在編譯時會被消除,所以無法在運行時得知其類型參數的類型,而且無法直接使用基本值類型作為泛型類型參數。Java編譯程序在編譯泛型時會自動加入類型轉換的編碼,故運行速度不會因為使用泛型而加快。
由於運行時會消除泛型的對象實例類型信息等缺陷經常被人詬病,Java及JVM的開發方面也嘗試解決這個問題,例如Java通過在生成字節碼時添加類型推導輔助信息,從而可以通過反射接口獲得部分泛型信息。通過改進泛型在JVM的實現,使其支持基本值類型泛型和直接獲得泛型信息等。
Java允許對個別泛型的類型參數進行約束,包括以下兩種形式(假設T是泛型的類型參數,C是一般類、泛類,或是泛型的類型參數):
  • T實現接口I。
  • T是C,或繼承自C。 [1] 
參考資料
  • 1.    Andres Löh, Exploring Generic Haskell, Ph.D. thesis, 2004 Utrecht University. ISBN 90-393-3765-9