目录:
一、为什么要有泛型
二、在集合中使用泛型
三、自定义泛型结构
四、泛型在继承上的体现
五、通配符的使用
六、泛型应用举例
/*--------------------分割线--------------------*/
一、为什么要有泛型
1.解决元素存储的安全性问题。
2.解决获取数据元素时,需要类型强制转换的问题。
二、在集合中使用泛型
ArrayList<Integer> list = new ArrayList<>();
基本数据类型需要用到包装类。
三、自定义泛型结构
泛型的声明:
interface List<T> 和class GenTest<K,V>
其中T,K,V表示类型,常用T表示。
泛型的实例化:
一定要在类名后面指定类型参数的值(类型)。
List<String> strList = new ArrayList<String>();
把一个集合中的内容限制为一个特定的数据类型,这就是generics背后的核心思想。
使用泛型的主要优点是能够在编译时而不是在运行时检测错误。
1.泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。如:
<E1,E2,E3>
2.泛型类的构造器如下:public GenericClass(){}。
3.实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。
4.泛型不同的引用不能相互赋值。
5.泛型如果不指定,均按Object处理。
经验:泛型要使用一路都用,要不用,一路都不要用。
6.如果泛型结构是一个接口或抽象类,则不可创建泛型类的对象。
7.静态方法中不能使用类的泛型。
8.异常类不能是泛型。
9.父类有泛型,子类可以保留也可以指定泛型类型。
泛型方法的格式:
[访问权限] <泛型> 返回类型 方法名 ([泛型表示 参数名称]) 抛出的异常
四、泛型在集成上的体现
五、通配符的使用
List<?>是List<Object>List<String>等各泛型的父类。
null是所有类型的成员。
通配符指定上限:
上限extends:使用时指定的类型必须是继承某个类,或者实现某个接口即 <=
通配符指定下限:
下限super:使用时指定的类型不能小于操作的类,即>=
六、泛型应用举例