JAVA平台泛型的意义:JAVA平台中使用泛型,可以提高代码的复用性,减少数据的类型转换,从而提高代码的运行效率,使代码更健壮.
1.非泛型的类及泛型类:
1-1. 下面是一个非泛型的类(即一个普通类):
public class Box{
private Object object;
public void add(Object object){
this.object = object;
}
public Object get(){
return object;
}
}
上述的类提供这样一个功能:
任意传入一个对象,然后返回该对象.如下:
public class BoxDemo1{
public static void main(String[] args){
Box integerBox = new Box();
integerBox.add(new Integer(10));
integer someInteger = (Integer)integerBox.get();
System.out.println(someInteger);
}
}
上述没有作任何参数的限制与检验.例如把上述中语句:
integerBox.add(new Integer(10));
改为:
integerBox.add("10");
编译时是不会报错的,但是运行时会执行不下去.在GUI,中经常收集用户输入的值,一般是作为字符串类型的.
1-2.泛型类型
声明一个泛型类型语法形式如下:
[修饰符] class 类名<类型参数> [extends 父类名] [implements 接口1,接口2,...]{
类体
}
可见,泛型类比普通类比多了"<类型参数>".
Box类的泛型版本:
public class Box<T>{
private T t;
public void add(T t){
this.t = t;
}
public T get(){
return t;
}
}
在上面的代码中,将所有出现Object的地方用T来代替.即在每个类型变量处分别用一个实际的具体类型替代使用的值替换掉T,例如:
Box<Integer> integerBox;
integerBox = new Box<Integer>();
一旦integerBox被初始化,就可以随便调用它的方法,而不需要使用类型转换.如果引用的时候传递参数不对将在编译期间报错.如下:
public class BoxDemo3 {
public static void main(String[] args){
Box<Interger> integerBox = new Box<Integer>();
integerBox.add(new Integer(10));
integer someInteger = integerBox.get();
System.out.println(someInteger);
}
}
1-3.小结:
泛型Box类比普通Box类只是多了"参数类型"检测的一种手段.
1-4.类型参数的命名惯例
泛型类比普通类多了个<类型参数>,如<T>.在JAVA平台中,通用的类型参数如下:
E--元素;
K--键;
N--数字;
T--类型;
V--值.
S、U、V等--第二、第三、第四个类型.
2.泛型方法
泛型方法和泛型类相仿.如下:
public <U> void inspect(U u){
//方法体
}
3.限定的类型参数
声明一个限定的类型参数,通过列出类型参数的名字,后跟exends关键字来限定它的"上限";后跟super关键字来限定它的"下限".
public <U extends Number> void inspect(U u){
//方法体
}
定义一个泛型方法,将类型参数限定为Number类或其子类.
4.通配符
泛型中,使用"?"来表示一个未知的类型.例:
Cage<? extends Animal> someCage = ...;
"? extends Animal"读作"一个未知的类型,它是Animal的子类型,可能是Animal的子类,也有可能是Animal本身".