具体使用方法~
1、定义泛型类
在定义带泛型的类时,在紧跟类命之后的 < >内,指定一个或多个泛型的名字,同时也可以对泛型的取值范围进行限定,多个泛型之间用,号分隔。
定义完泛型后,可以在定义位置之后的类的几乎任意地方(静态块,静态属性,静态方法除外)使用泛型,就像使用普通的类型一样。
注意,父类定义的泛型不能被子类继承。
例://自定义一个泛型
public class MyGenerics {
private T1 param1;
private T2 param2;
public T1 getParam1() {
return param1;
}
public void setParam1(T1 param1) {
this.param1 = param1;
}
public T2 getParam2() {
return param2;
}
public void setParam2(T2 param2) {
this.param2 = param2;
}
}
使用自定义的泛型:public static void main(String[] args) {
//使用自定义的泛型
MyGenerics myGenerics = new MyGenerics ();
myGenerics.setParam1(1);
myGenerics.setParam2("abc");
}
注意:如果一个泛型函数在一个泛型类里面出现,最好避免在方法的泛型和类的泛型中使用同样的名字来避免混淆。对内部类也是同样。
2、定义带泛型方法
在定义带泛型的方法时,在紧跟可见范围修饰(例如public)之后的 < >内,指定一个或多个泛型的名字,同时也可以对泛型的取值范围进行限定,多个泛型之间用,号分隔。
定义完泛型后,可以在定义位置之后的方法的任意地方使用泛型,就像使用普通的类型一样。
例如:public T testGenericMethodDefine(T t, S s){
...
}
注意:定义带泛型的方法,主要目的是为了表达多个参数以及返回值之间的关系。
3、通配符
类型的通配声明:
可以使用“?”通配字元,并使用extends关键字限定持有者的类型。
声明一个类型时进行限定:
例:public static void main(String[] args) {
//使用’?’通配字元,并使用extends关键字限定持有者的类型
MyGenerics extends Object, ? extends List > myGenerics = null;
//创建满足类型要求的对象
myGenerics = new MyGenerics >();
//以下是不符合通配要求的因为HashMap没有实现List
//myGenerics = new MyGenerics ();
//给泛型的泛型赋值
MyGenerics3 extends Object, ? extends List > myGenerics3 = null;
myGenerics3 = new MyGenerics3 >();
//可以设置为null
myGenerics3.setMyGenerics(null);
}
MyGenerics3 , ? > myGenerics3 = null;
等价于:MyGenerics3 extends Object, ? extends Object > myGenerics5 = null;
4、数组范型
可以使用带范型参数值的类声明数组,却不可有创建数组,不能使用new关键字创建T类型的对象,而应该传递一个具体的参数类型,如下面的将编译不通过:MyGenerics myGenerics = new MyGenerics ();
例:public class MyGenerics2 {
private T[] param1;
public T[] getParam1() {
return param1;
}
public void setParam1(T[] param1) {
this.param1 = param1;
}
5、使用泛型的好处:
如果使用了泛型,只要代码在编译时没有出现警告信息,就不会遇到运行时的ClassCastException异常。