一、泛型的引入
例如:我向一个ArrayList集合中添加Person类的对象,但是不小心手贱添加了一个Boy类的对象,这就会导致如下结果。
List list = new ArrayList();
list.add(new Person("张三"));
list.add(new Person("李四"));
list.add(new Boy("王五"));
这时候编译器是不会报错的,运行的时候也不会报错。但是如果如下输出
for(Object o : list){
Person person = (Person)o;
}
运行时,类型转换的时候 (Person)o;就会报错。
传统的方式不能对加入到集合ArrayList中的数据类型进行约束(不安全)遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响 这就极大地降低了程序的健壮性,因此设计者针对此问题引入了泛型!
二、使用泛型的好处
1.提升了程序的健壮性和规范性
针对上述问题,当我们采用泛型就会显得非常简单,只需要在编译类型后利用泛型指定一个特定类型,编译器就会自动检测出不符合规范的类并抛出错误提示:
List<Person> list = new ArrayList();
list.add(new Person("张三"));
list.add(new Person("李四"));
list.add(new Boy("王五"));
最后一个add的时候,编译器就会报错。
2.编译时,检查添加元素的类型,提高了安全性
3.减少了类型转换的次数,提高效率
- 当不使用泛型时:
- 当使用泛型时:
4.在类声明时通过一个标识可以表示属性类型、方法的返回值类型、参数类型
三、泛型常见用法
1.定义泛型接口
曾经写接口的时候都没有定义泛型,它默认的就是Object类,其实这样写是不规范的!
interface Im<U,R>{
void hi(R r);
void hello(R r1,R r2,U u1,U u2);
default R method(U u){
return null;
}
}
在上述的泛型接口中已经规定传入其中的必须是U,R类的对象,那么当我们传入其他类的对象时就会报错,如图:
2.定义泛型集合
List<Person> list = new ArrayList();