泛型
泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。这种类型参数可以在类、接口、和方法的创建中,分别被称为泛型类、泛型接口、泛型方法。
一、认识泛型
在没有泛型之前,通过对类型Object的引用来实现参数的"任意化",但"任意化"带来的缺点是需要显示的强制类型转换,此种转换要求开发者对实际参数类型预知的情况下进行,对于强制转换错误的情况,编译器可能不会提示错误,但在运行时会出现异常,这是一个安全隐患。
举例:不使用泛型实现参数化类型
package generic;
public class NoGeneric {
private Object ob; //定义通用类型成员
public NoGeneric(Object ob) {
this.ob = ob;
}
public Object getOb() {
return ob;
}
public void setOb(Object ob) {
this.ob = ob;
}
public void showType() {
System.out.println("实际类型是:"+ob.getClass().getName());
}
}
package generic;
public class NoGenericDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//定义类NoGener的一个Integer版本
NoGeneric intob = new NoGeneric(new Integer(66));
intob.showType();
int i = (Integer)intob.getOb();
System.out.println("value="+ i);
System.out.println("-----------------------------");
//定义类NoGeneric的一个String版本
NoGeneric strob = new NoGeneric(new String("hello"));
strob.showType();
String s = (String)strob.getOb();
System.out.println("value="+ s);
}
}
执行结果为:
实际类型是:java.lang.Integer
value=66
-----------------------------
实际类型是:java.lang.String
value=hello
上面的实例有两点需要注意:首先如下语句
String s = (String)strob.getOb();
在使用时必须明确指定返回对象需要被强制转化的类型为String,否则无法编译通过;其次,由于intob和strob都属于NoGeneric的类型,假如执行如下语句
intob = strob;
此种赋值,语法上是合法的,而在语义上是错误的,对于这种情况,只有在运行时才会出现异常,使用泛型就不会出现上述错误,泛型的好处就是在编译期 检查类型,捕捉类型不匹配错误,并且所有强制转换都是自动和隐式的,提高代码的重用率.
举例 2:使用泛型使用泛型实现参数实例化类型
package generic;
public class Generic<T> {
private T ob; //定义泛型成员变量
public Generic(T ob) {
this.ob = ob;
}
public T getOb() {
return ob;
}
public void setOb(T ob) {
this.ob = ob;
}
public void showType() {
System.out.println("实例类型为:" + ob.getClass().getName());
}
}
package generic;
public class GenericDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//定义泛型Generic的一个Integer的版本
Generic<Integer> intob = new Generic<Integer>(88);
intob.showType();
int i = intob.getOb();
System.out.println("value=" + i);
System.out.println("----------------------");
//定义泛型Generic的一个String版本
Generic<String> strob = new Generic<String>("hello");
strob