一、泛型在继承上的体现
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>的子类。
但是:如果类 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 }