Java语言高级特性之——泛型
一、泛型的概念及主要作用
定义:泛型即参数化类型,将数据类型作为参数传入,例如List、List等等。
泛型的作用有:
(1)适用于多种数据类型执行相同的代码;
(2)指定容器(Map、List、Set等)的类型,不需要进行强制转换。
二、泛型的使用
可以定义泛型类、泛型接口和泛型方法。
泛型类的定义:
class 类名 {
}
其中T为泛型参数,常用大写字母T、K、V或E表示,也可使用字符串表示,泛型参数允许有多个,如下例:
public class A<T>{
private T data;
public A(T data){
this.data = data;
}
public T getData(){
return data;
}
public void setData(T data){
this.data = data;
}
}
泛型接口的定义:
public interface 类名<泛型参数> {
}
例如:
public interface B<T> {
public T next();
}
泛型接口的实现有两种方式,一种是实现类也设定为泛型类型,如下例:
public class ImplB<T> implements B<T>{
@override
public T next(){
return null;
}
}
另一种是给实现类指定具体类型,如下例:
public class ImplB2 implements B<String> {
@Override
public String next(){
return null;
}
}
泛型类在new一个泛型类的对象时指定具体类型,例如
A a = new A<String>();
B b = new ImplB<String>();
泛型方法的定义:
泛型方法可以定义在普通类中,也可以定义在泛型类或泛型接口中。
如:
public class C {
/**
* next为泛型方法
**/
public <T> T next(T ...a){
return a[a.length/2];
}
}
泛型方法在调用时指定具体类型:
C c = new C();
c.<String>next("A","B","C");
c.next(12,43,54);//高版本编译器可以省略,自动判定类型。
三、类型变量的限定:作用在类或方法上
public class ArrayAlg {
/**
*类型变量的限定,其中泛型T的具体类型必须实现了CompareTo接口。
*extends后可以跟至多一个类或多个接口,顺序是类在最前面,接口在后面,中间用'&'符号连接,
*例如<T extends ArrayList&Comparable&List>
**/
public static <T extends Comparable> T min(T a,T b){
if(a.compareTo(b)>0){
return a;
}
return b;
}
}
四、泛型的约束和局限性
- 不能实例化泛型的类型变量,即不能写:new T();
- 静态域或者方法里不能引用泛型变量,因为对象创建之后才能确定泛型的具体类型,但jvm创建对象时先执行的是静态方法。但是静态的泛型方法可以引用本身的泛型变量。
- 泛型类型不能指定为基本类型,必须是对象类型。如,不能使用List,而应该用List。
- 泛型不能用instanceof关键字来判定其具体类型。
- 不能创建泛型数组。
- 泛型类不能派生自Exception和Throwable。
五、通配符
通配符常用在方法的参数上。
1.上界