一、泛型的引入
继承是面向对象的三大特性之一,比如在我们向集合中添加元素的过程中 add() 方法里填入的是 Object 类,但是 Object 又是所有类的父类,所以这就产生了一个问题——添加的类型无法做到统一,因此就可能出现我们在遍历集合的时候,取出的元素类型不统一进而代码报错。
举个栗子:
例如:向一个 ArrayList 集合中添加 Animal 类的对象,但是我们不小心添加了一个 Person 类的对象,这就会导致如下结果
传统的方式不能对加入到集合 ArrayList 中的数据,进行类型约束(不安全)遍历的时候,所以需要进行类型转换,如果集合中的数据量较大,对效率会有影响,这就极大地降低了程序的健壮性,因此设计者针对此问题引入了泛型。
二、使用泛型的好处
- 提升了程序的健壮性和规范性;
针对上述问题,当我们采用泛型就会显得非常简单,只需要在编译类型后利用泛型指定一个特定类型,编译器就会自动检测出不符合规范的类并抛出错误提示。
- 编译时,检查添加元素的类型,提高了安全性;
- 减少了类型转换的次数,提高效率;
- 当不使用泛型时:
- 当使用泛型时:
- 在类声明时通过一个标识可以表示属性类型、方法的返回值类型、参数类型;
可以这样理解:上述的 class Animal< E > 中的「E」相当于这里的 E 是一个躯壳,占位用的,以后定义的时候我们可以自己去自定义。
例如:
三、泛型常见用法
1.定义泛型接口
如果在写接口的时候都没有定义泛型,它默认的就是 Object 类,其实这样写是不规范的。
在上述的泛型接口中已经规定传入其中的必须是 A,B 类的对象,那么当我们传入其他类的对象时就会报错。
2.定义泛型集合
使用泛型方式给 HashMap 中放入三个学生对象,并输出对象信息;
四、泛型使用细节
1.<>中类型规范
类型实参不能为基本数据类型。
2.继承性体现
在给泛型指定具体类型后,可以传入该类型或者其子类类型。
扫描二维码关注公众号,回复:
16502929 查看本文章
P<A> ap = new P<A>(new A());
P<A> ap1 = new P<A>(new B()); //A的子类
class A {
}
class B extends A{
}