在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
package fanxing;
public class Gen<T> { private T ob; public Gen(T ob){ this.ob=ob; } public T getOb() { return ob; } public void setOb(T ob) { this.ob = ob; } public void showType(){ System.out.println("T的实际类型是:"+ob.getClass().getName()); } }
package fanxing;
public class GenDemo {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Gen<Integer> intob=new Gen<Integer>(88); intob.showType(); int i=intob.getOb(); System.out.println("value:"+i); System.out.println("---------------"); Gen<String> strob=new Gen<String>("hello Gen"); strob.showType(); String str=strob.getOb(); System.out.println("value:"+str); System.out.println("---------------"); }
}运行结果:
T的实际类型是:java.lang.Integervalue:88---------------T的实际类型是:java.lang.Stringvalue:hello Gen---------------
不使用泛型:
package fanxing;
public class Gen2 { private Object ob; public Gen2(Object ob){ this.ob=ob; } public Object getOb() { return ob; } public void setOb(Object ob) { this.ob = ob; } public void showType(){ System.out.println("T的实际类型是"+ob.getClass().getName()); }}
package fanxing;
public class GenDemo2 {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Gen2 intob=new Gen2(new Integer(88)); intob.showType(); int i=(Integer)intob.getOb(); System.out.println("value:"+i); System.out.println("---------------"); Gen2 strob=new Gen2(new String("hello Gen2")); strob.showType(); String str=(String)strob.getOb(); System.out.println("value:"+str); System.out.println("---------------"); }
}
运行结果为:
T的实际类型是java.lang.Integervalue:88---------------T的实际类型是java.lang.Stringvalue:hello Gen2---------------
迭代器:
Iterator迭代器是一个对象,它的工作是遍历并选择序列中的对象,客户端程序列不关心序列底层的结构。迭代器通常被称为"轻量级"对象;创建它的代价很小。迭代器和泛型配合使用恩能起到很好的作用
