为什么使用泛型
泛型的好处是在编译的时候检查类型的安全性,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。
泛型的作用:
- 安全性
- 消除转换
- 提升性能
- 重用性
1.保证了类型的安全性
在没有泛型之前。从集合读取到的每一个对象都必须进行类型的强制转换,如果不小心插入了错误的类型对象,在运行的时候转换处理就会出错。
比如:没有泛型的情况下使用集合:
在没有定义泛型的时候,编译时会通过的。
但是在使用泛型的时候编译是不会通过的
有泛型之后,定义好的add(52)就会编译不通过。
相当于告诉编译器每个集合接收的对象类型是什么,编译器在编译的时候就会检查类型,然后告知是否出现了错误类型的对象,是的程序更加安全,增加了程序的健壮性。
2.消除强制转换
泛型的一个附带好处就是,消除了源代码中的许多强制转换,这使得代码更加可读,并且减少了出错的机会。
比如:没有在没有泛型的情况下,代码需要强制转换
但是在使用泛型之后,代码就不用强制转换了
3.避免了不必要的装箱、拆箱操作,提高了程序的性能
在非泛型编程中,将简单类型作为Object传递时会引起Boxing(装箱)和UNboxing(拆箱)操作,这两个过程都是具有很大的开销的。引入泛型后,就不必进行Boxing和UNboxing操作了,所以运行效率相对较高,特别在对集合进行操作非常频繁的系统中,这个特点带来的性能提升更加明显了。
泛型变量固定了类型,使用的时候就已经知道是值类型还是引用类型,避免了不必要的装箱和拆箱操作。
4.提高了代码的重用率
泛型类
泛型接口
泛型方法
类型通配符
泛型中包含三种通配符分别是:无边界的通配符、固定上界的通配符、固定能够下界 的 通配符。
1.无边界通配符表示任意的类型都可以接受 就是<?> ,比如:ArrayList<?>
无边界通配符的主要作用是让泛型能够接受未知类型的数据。
2.固定下边界类型表示参数类型必须是A类或者是A的子类,比如:ArrayList<? extends E>
使用固定下边界的通配符的泛型,就能够接受指定类型及其子类的类型数据。要声明使用该类的通配符,采用<? extends E>的形式,这里的E就是该泛型的上边界。
注意:这里虽然用的extends关键字,却不仅限于继承了父类E的子类,也可以代以代指显现了接口E的类。
- 固定下边界的通配符表示参数类型必须是A或者A的超类型,比如:<? super E>
使用固定下边界的通配符的泛型,就能够接受指定类及其父类类型的数据。要声明使用该类的通配符,采用<? super E>的形式,这里的E就是该泛型的下边界。
注意:你可以认为一个泛型指定上边界或下边界,但不能同时指定上下边界。
使用方法:
泛型中KTVE的含义
E:elements(在集合中使用,因为集合中存放的是元素)
T:Type(java类)
K: Key(键)
V:Value(值)
N:Number(数值类型)
?:表示不确定的java类型