泛型程序设计(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)。
泛型程序设计(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)。
一些
强类型程序语言支持泛型,其主要目的是加强
类型安全及减少类转换的次数,但一些支持泛型的程序语言只能达到部分目的。
.NET泛型的参数只可以代表类,不能代表个别对象。由于 .NET 泛型的类型参数之实际类型在运行时均不会被消除,运行速度会因为类型转换的次数减少而加快。另外,使用GetType()方法可于程序运行时得知泛型及其类型参数的实际类型,更可以运用
反射编程。
Java 泛型的参数只可以代表类,不能代表个别对象。由于Java泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型,而且无法直接使用基本值类型作为泛型类型参数。Java编译程序在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。
由于运行时会消除泛型的对象实例类型信息等缺陷经常被人诟病,Java及JVM的开发方面也尝试解决这个问题,例如Java通过在生成字节码时添加类型推导辅助信息,从而可以通过反射接口获得部分泛型信息。通过改进泛型在JVM的实现,使其支持基本值类型泛型和直接获得泛型信息等。