|名词定义|
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是一般类、泛类,或是泛型的类型参数):
T实现接口I。
T是C,或继承自C。
C++的泛型
C++ 泛型的参数可以代表类或个别对象。在一般意义上,C++ 缺乏对泛型的类型参数进行直接约束的手段,但可利用 SFINAE(模板代换失败非错误,指在模板实例化过程中的错误仅意味此次代换失败,并不一定产生编译错误)规则及 C++11 的 static_assert 等实现相似功能。
|参考资料|
[1] 阿里云大学Java视频课程
[2] Java开发者
[3] Java教程
[4] 维基百科