泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
class ObjectDemo{
private Object ob;
public ObjectDemo(Object ob){
this.ob = ob;
}
setter getter...
}
ObjectDemo测试:
public static void ObjectDemoTest(){
ObjectDemo strOD = new ObjectDemo("123");
ObjectDemo dOD = new ObjectDemo(new Double(23));
ObjectDemo od = new ObjectDemo(new Object());
System.out.println((String)strOD.getOb());
System.out.println((Double)dOD.getOb());
System.out.println(od.getOb());
}
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
class ObjectDemo{
private Object ob;
public ObjectDemo(Object ob){
this.ob = ob;
}
setter getter...
}
ObjectDemo测试:
public static void ObjectDemoTest(){
ObjectDemo strOD = new ObjectDemo("123");
ObjectDemo dOD = new ObjectDemo(new Double(23));
ObjectDemo od = new ObjectDemo(new Object());
System.out.println((String)strOD.getOb());
System.out.println((Double)dOD.getOb());
System.out.println(od.getOb());
}
class GenDemo{ private T t; public GenDemo(T t) { this.t = t;
}
public void setT(T t) { this.t = t;
} public T getT() { return t;
}
}
测试:省去了手动进行强制转换
public static void GenTest() {
GenDemo strOD = new GenDemo("123");
GenDemo dOD = new GenDemo(new Double(23));
GenDemo od = new GenDemo(new Object());
System.out.println(strOD.getT());
System.out.println(dOD.getT());
System.out.println(od.getT());
}
下面解释一下上面的泛型语法:
使用表示一个类型持有者名称, 相当于一个形参,数据的类型是有实际传入的数据的类型决定,然后T作为成员、参数、方法的返回值的类型。 T仅仅是一个名字,可以随意取的。 class GenDemo , T没有进行任何限制, 实际相当于 Object, 等同于 class GenDemo。 与Object相比,使用泛型所定义的类,在定义和声明,可以使用来制定真实的数据类型,如:
GenDemo dOD = new GenDemo(new Double(23)); 也可以不指定,那么就需要进行强制转换。