两种快速理解泛型的描述
1. 数据类型是抽象的,这个类可以处理很多数据类型。里面的T在被实例化的时候可以用任意类型代替。
2. 泛型,想成一个桶,你装水或者装沙子都行,这个桶只负责提供装满水或者装满沙子的功能 。
官方解释:
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部份,那些部份在使用前必须作出指明。
泛型的定义主要有以下两种:
- 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
- 在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(现在人们大多把这称作模板)
不论使用那个定义,泛型的参数在真正使用泛型时都必须作出指明。
一些强类型程序语言支持泛型,其主要目的是加强类型安全及减少类转换的次数。
伪代码例子
类 例泛类<T> { 值 : T 设置值(新值 : T) { 值 := 新值 } 获取值() : T { 返回 值 } } 例方法1() { 例对象 : 例泛类<整数型> 例对象 := 新 例泛类<整数型>() 例对象.设置值(5) 输出整数(例对象.获取值()) } 例方法2() { 例对象 : 例泛类<浮点数型> 例对象 := 新 例泛类<浮点数型>() 例对象.设置值(5.5) 输出浮点数(例对象.获取值()) }
在这例子中,例泛类
是一个泛型,而T
是一个类型参数。在例泛类
中没指明T
的实际类型,只有例方法1()
和例方法2()
在使用例泛类
时才加以指明。
运行这例子的例方法1()
将输出整数5,而运行例方法2()
将输出浮点数5.5。
Java的泛型
Java泛型的参数只可以代表类,不能代表个别对象。由于Java泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。Java编译程序在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。