Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
eg:
假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现?
答案是可以使用 Java 泛型。
使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。
泛型方法
你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
下面是定义泛型方法的规则:
1、所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的
2、每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
3、类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
4、泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)
泛型类
泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。
和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。
类型通配符
在泛型操作中也可以通过通配符接收任意指定泛型类型的对象。
1、匹配任意类型的通配符(?)
Info<?> i = new Info(String)(); //使用?接收泛型对象
2、受限泛型
设置上限://范围上限使用extends关键字声明,表示泛型的类型可能是所指定的类型或者是此类型的子类
// 只能接收Number及其Number的子类
声明对象: 类名称<? extends 类> 对象名称 ---> Info<? extends Number> i;
// 此处泛型只能是数字类型
声明类:[访问权限] 类名称 <泛型标识 extends 类>{} ---> public Info<T extends Number>{}
设置下限://范围下限使用super进行声明,表示泛型的类型可能是所指定的类型,或者是此类型的父类型,或是Object类
// 只能接收Number或Object类型的泛型,Number类的父类只有Object类
声明对象:类名称<? super 类> 对象名称 ---> Info<? super Number> i;
// 此处泛型只能是数字类型
声明类:[访问权限] 类名称 <泛型标识 extends 类>{} ---> public Info<T extends Number>{}
解释:泛型与子类继承的限制。
一个类的子类可以通过对象多态性,为其父类实例化,但是在泛型操作中,子类的泛型类型是无法使用父类的泛型类型接收的。例如:Info