1. 解决元素存储的安全性问题, 好比商品、 药品标签, 不会弄错。
2. 解决获取数据元素时, 需要类型强制转换的问题, 好比不用每回拿商品、 药品都要辨别。
在集合中使用泛型的例子:
ArrayList<Integer> list = new ArrayList<>();
1、在自定义class中也可以使用泛型,但实例化时一般要指明类的泛型
2、static 方法中不能使用类的泛型,因为Static方法的加载比类实例化得早。
3、异常类不能是泛型的
4、不能使用new E[ ]。但是可以: E[ ] elements = ( E[ ] )new Object[i];
5、若父类有泛型,则子类可以选择保留泛型也可以选择指定泛型类型。子类除了指定或保留父类的泛型,还可以增加自己的泛型。
- //自定义泛型类
- class order<T>{
- private T orderT;
- private String desc;
-
- public order(T orderT, String desc) {
- this.orderT = orderT;
- this.desc = desc;
- }
- ... ...
- }
-
- //子类保留泛型
- class subOrder extends order1<String>{
-
- public subOrder(String orderT, String desc) {
- super(orderT, desc);
- }
- }
-
- //子类增加泛型
- class subOrder1<A> extends order{
-
- public subOrder1(A orderA, String desc) {
- super(orderA, desc);
- }
-
- }
-泛型方法的泛型参数与类的泛型参数没有关系。其所属类不一定非要是泛型类
-泛型方法在调用时指定泛型参数的类型
-泛型方法可以声明为static的,因为泛型参数是在调用方法时确定的,而非实例化时确定。
格式:[访问权限] 返回类型 方法名([泛型标识 参数名称]) 抛出的异常
- class subOrder1<A> extends order1{
-
- public subOrder1(A orderA, String desc) {
- super(orderA, desc);
- }
- public <T> List<T> GenericMethod(T list){
- System.out.println("这是泛型方法");
- return null;
- }
- }
如果B是A的一个子类型(子类或者子接口),而G是具有泛型声明的类或接口,G<B>并不是G<A>的子类型! 比如:String是Object的子类,但是List<String>并不是List<Object>的子类。它们是并列关系。
-若A是B的父类,则A<G> 是 B<G> 的父类,如 List<String> 与 ArrayList<String>
通配符:?
A是B的父类,G<A>和 G<B> 没有关系,二者共同的父类是:G <?>
例如:List<?>是List<String>、List<Integer>等各种泛型List的父类。
对于G<?>,不能向其内部添加数据,除了null;允许读取数据,数据类型为Object。
1.<?>允许所有泛型的引用调用
2.通配符指定上限:
上限extends:使用时指定的类型必须是继承某个类,或者实现某个接口,即<=
<? extends A> (无穷小 , A] 只允许泛型为 A 及 A 的子类的引用调用
3.通配符指定下限:
下限super:使用时指定的类型不能小于操作的类,即>=
<? super A> [A , 无穷大) 只允许泛型为 A 及 A 父类的引用调用
<? extends Comparable> 只允许泛型为实现Comparable接口的实现类的引用调用