目的
背景:
jdk1.5 之前,对象保存到集合中会丧失类型,变为Object,
被取出时需要类型转换,可能转错
- 在定义集合时就限定了传入集合的元素对象类型
使得同一集合中只能有同一类型的元素 - 生成的class文件中将不再保留泛型信息
书写规则
创建对象时,若两边都有泛型,声明和新建对象内的泛型类型要一致\n List list= new List
泛型的类型
<>中必须是引用类型,不能是基本数据类型
特点
特点
优点
- 类型安全
- 无需手动转型
- 消除运行时异常ClassCastException ,
- 若有类型错误,在编译时报错
缺点
书写变复杂
在自定义类型中使用泛型
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,
class Utils<QQ>{//class 后的<>泛型限定,
private QQ q;
public void setObject(QQ q){ //参数类型
this.q = q;
}
public QQ getObject(){ //返回值
return q;
}
}
Utils<Worker> u = new Utils<Worker>();
u.setObject(new Student());
Worker w = u.getObject();;
//泛型前做法。
class Tool{
private Object obj;
public void setObject(Object obj){
this.obj = obj;
}
public Object getObject(){
return obj;
}
}
Tool t = new Tool();
t.setObject(new Student());
Worker w = (Worker)t.getObject()//类型转换;
泛型方法
一般方法
- 在泛型类定义泛型,在整个类中都有效。
- 为了让同一类中的不同方法可以操作不同类型, 而且类型还不确定。可以将泛型定义在方法上。
- 当泛型类已经被定义时,通过在<>内使用不同的符号来表示不同的引用类型
class Demo<T>{
public void show(T t){
System.out.println("show:"+t);
}
public <Q> void print(Q q){ //注意:这里的<Q>不是返回值,是定义的泛型类型
System.out.println("print:"+q);
}
public static <W> void method(W t){//<w>定义泛型类型W
System.out.println("method:"+t);
}
}
当泛型类未定义时,不管方法内部的符号是否相同,
不同方法之间的泛型类型不相互影响
class Demo{
public void show(T t){
System.out.println("show:"+t);
}
public void print(T t){
System.out.println("show:"+t);
}
}
静态方法
静态方法不能使用类上定义的泛型,如果静态方法需要使用泛型\n需要在函数定义的返回值类型左侧定义\
public static <W> void method(W t)
{
System.out.println("method:"+t);
}
因为静态 在定义类时就需要加载,
而泛型类的泛型具体类型在运行时才能确定