1 说明
1)Generics是对java语言类型系统的一种扩展,以支持创建可以按类型进行参数化的类或者方法。
2)泛型的优点:
1. 类型安全(使用泛型时,编译器可以捕获附加类型信息,从而类型错误在编译时被捕获而不是运行时来进行检测)
2. 消除强制类型转换,减少了代码出错的可能性,并且使代码更加可读
2 泛型类实例
不使用泛型,此种情况需要类型转换
packagecom.wish.generic;public classPerson {privateObject x;privateObject y;privateObject z;publicObject getX(){returnx;
}public voidsetX(Object x){this.x =x;
}publicObject getY(){returny;
}public voidsetY(Object y){this.y =y;
}publicObject getZ(){returnz;
}public voidsetZ(Object z){this.z =z;
}public static voidmain(String[] args) {
Person s= newPerson();
s.setY(20);int x =(Integer)s.getX();
System.out.println(x);
}
}
使用泛型:
packagecom.wish.generic;public class PersonG{privateT1 x;privateT2 y;publicT1 getX(){returnx;
}public voidsetX(T1 x){this.x =x;
}publicT2 getY(){returny;
}public voidsetY(T2 y){this.y =y;
}public static voidmain(String[] args){
PersonG pg = new PersonG(); //实例化时即可定义类型
pg.setX(20);
pg.setY("this is a string");
System.out.println(pg.getX());
System.out.println(pg.getY());
}
}
3.泛型方法
说明:
1)泛型的声明必须在方法的修饰符(public,static,final,abstract等)之后,返回值声明之前
2)和泛型类一样,可以声明多个泛型,用逗号隔开
泛型方法类:
packagecom.wish.generic;public classGenFunction {public static voiddisplay(T t){
System.out.println(t.getClass());
}
}
测试类:
packagecom.wish.generic;public classDriver {public static voidmain(String[] args) {
GenFunction.display(11);
GenFunction.display(11f);
GenFunction.display("abcd");
}
}
输出:
classjava.lang.Integerclassjava.lang.Floatclass java.lang.String
关于类型擦除的说明:类型擦除是指运行期不关注泛型的类型信息,但是t.getClass返回的是实例的类型类型而不是泛型的信息
4.注意事项
1)Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉(类型擦除)
2)泛型类并没有自己独有的Class类对象。比如并不存在List.class或是List.class,而只有List.class。