操作 Java 泛型(三):泛型在继承方面体现与通配符使用

一、泛型在继承上的体现

  1、先看两段代码有何不同

    片段1:

1   public void printCollection(Collection c) {
2         Iterator i = c.iterator();
3         for (int k = 0; k < c.size(); k++) {
4             System.out.println(i.next());
5         }
6     }

 

 

      片段2:

 

1   public void printCollection(Collection<Object> c) {
2         for (Object e : c) {
3             System.out.println(e);
4         }
5     }

 

 

 

 

 

  2、泛型在继承上的体现

    如果B是A的一个子类型(子类或者子接口),而G是具有泛型声明的类或接口, G<B>并不是G<A>的子类型!

    比如: String是Object的子类,但是List<String >并不是List<Object>的子类。

    操作 Java 泛型(三):泛型在继承方面体现与通配符使用

 

 

     但是:如果类 A 是类 B的父类,A<G> 是 B<G> 的父类。

 

 

  3、代码体验

    实验一:

 1     @Test
 2     public void test(){
 3 
 4         Object obj = null;
 5         String str = null;
 6         obj = str;
 7 
 8         Object[] arr1 = null;
 9         String[] arr2 = null;
10         arr1 = arr2;
11 
12 
13         //编译不通过
14         //Date date = new Date();
15         //str = date;
16 
17 
18         List<Object> list1 = null;
19         List<String> list2 = new ArrayList<String>();
20         //此时的list1和list2的类型不具有子父类关系
21         //编译不通过
22         //list1 = list2;
23         
24     }

 

    实验二:

 1   public void testGenericAndSubClass() {
 2         Person[] persons = null;
 3         Man[] mans = null;
 4         // 而 Person[] 是 Man[] 的父类.
 5         persons = mans;
 6         
 7         Person p = mans[0];
 8         
 9         
10         // 在泛型的集合上
11         List<Person> personList = null;
12         List<Man> manList = null;
13         // personList = manList;(报错)
14     }

 

 

    实验三:

 1     public void test(){
 2 
 3         AbstractList<String> list1 = null;
 4         List<String> list2 = null;
 5         ArrayList<String> list3 = null;
 6 
 7         list1 = list3;
 8         list2 = list3;
 9 
10         List<String> list4 = new ArrayList<>();
11 
12     }

 

 

  4、

  5、

二、

三、

四、

五、

上一篇:当数据智能遇上工业制造


下一篇:ArrayList两个对象之间的赋值