编程语言
首页 > 编程语言> > Java面向对象11-泛型与通配符

Java面向对象11-泛型与通配符

作者:互联网

泛型:就是一种不确定的数据类型。
比如:ArrayList<E> E就是泛型。 这种不确定的数据类型需要在使用这个类的时候才能够确定出来。
泛型可以省略,如果省略,默认泛型是Object类型。


自定义泛型类
 1 package com;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 //自定义泛型类
 7 public class order<T> {
 8     private String orderName;
 9     private int orderId;
10     private T t;
11     List<T> list = new ArrayList<T>();
12     public void add(){
13         list.add(t);
14     }
15     public T getT(){
16         return t;
17     }
18     public void setT(T t){
19         this.t = t;
20     }
21     public String getOrderName() {
22         return orderName;
23     }
24     public void setOrderName(String orderName) {
25         this.orderName = orderName;
26     }
27     public int getOrderId() {
28         return orderId;
29     }
30     public void setOrderId(int orderId) {
31         this.orderId = orderId;
32     }
33     @Override
34     public String toString() {
35         return "order [orderId=" + orderId + ", orderName=" + orderName
36                 + ", t=" + t + "]";
37     }
38     
39     
40 }

 

注意:

1.在静态方法中不能使用泛型,因为静态方法早于对象创建执行

2.异常类不能是泛型的

 

泛型在继承方面的体现

类A是类B的父类,G<A>和G<B>二者不具备子父类关系,二者是并列关系。

补充:类A是类B的父类,A<G> 是 B<G>的父类

 

通配符?的使用:

 1 import org.w3c.dom.ls.LSInput;
 2 
 3 import java.util.Iterator;
 4 import java.util.List;
 5 
 6 public class test {
 7     public static void main(String[] args) {
 8         List<Object> list1 = null;
 9         List<String> list2 = null;
10 
11         List<?> list = null;
12 
13         list = list1;
14         list = list2;
15 
16         test t = new test();
17         t.show(list1);
18         t.show(list2);
19     }
20 
21     public void show(List<?> list){
22         Iterator<?> iterator = list.iterator();
23         while(iterator.hasNext()) {
24             Object obj = iterator.next();
25             System.out.println(obj);
26         }
27     }
28 
29 }

添加(写入):对于List<?>不能向起内部添加数据,null除外

获取(读取):允许读取数据,读取的数据类型为object

 

有限制条件的通配符的使用

 

? extends T ----- 类型上界

这个时候这个通配符可以配的范围就是 T类型对象和T类型子类的对象
形象的也可以看成是 : (-oo , T];
就是负无穷到T — 把T包含在内
那么这个时候G<? extends A>就可以作为G< A>和G< B>的父类,其中A是B的父类

? super T — 类型下界

这个时候这个通配符可以配的范围就是T类型的对象和T类型的父类的对象
形象的说也可以看成是: [T , +oo)
也就是T到正无穷
那么这时候G<? super A> 就可以作为G< A>和G < C>的父类,其中A是C的子类

 

 1  /*
 2     有限制条件的通配符的使用
 3     ? extends A:
 4     G<? extends A> 可以作为G<A>和G<B>的父类,其中B是A的子类
 5     ? super A:
 6     G<? super A> 可以作为G<A>和G<B>的父类,其中B是A的父类
 7      */
 8     @Test
 9     public void test4(){
10         List<? extends Person> list1 = null;//<=
11         List<? super Person> list2 = null;//>=
12  
13         List<Student1> list3 = new ArrayList<Student1>();
14         List<Person> list4 = new ArrayList<Person>();
15         List<Object> list5 = new ArrayList<Object>();
16  
17         list1 = list3;
18         list1 = list4;
19 //        list1 = list5;
20  
21 //        list2 = list3;
22         list2 = list4;
23         list2 = list5;
24  
25         //读取数据:
26         list1 = list4;
27         Person p = list1.get(0);
28         //编译不通过
29 //        Student1 s = list1.get(0);
30  
31         list2 = list4;
32         Object o = list2.get(0);
33         //编译不通过
34 //        Person o = list2.get(0);
35  
36         //写入数据:
37         //编译不通过
38 //        list1.add(new Student1());
39  
40         //编译通过
41         list2.add(new Person());
42         list2.add(new Student1());
43  
44     }

 

标签:11,Java,list1,List,list2,泛型,父类,public
来源: https://www.cnblogs.com/zyx9710/p/16280259.html