黑马程序员技术交流社区

标题: 泛型上限的问题 [打印本页]

作者: 她只是过客    时间: 2014-9-6 22:00
标题: 泛型上限的问题
  1. public class GenericDemo4泛型上限 {

  2.         public static void main(String[] args) {
  3.                 ArrayList<Person> al=new ArrayList<Person>();//为什么就可以直接接受子类,
  4.                 al.add(new Student());
  5.                 al.add(new Person());
  6.                 HashSet<Worker> hs=new HashSet<Worker>();
  7.                 hs.add(new Worker());
  8.                
  9.                 Iteratorprint(al);
  10.                 Iteratorprint(hs);
  11.         }
  12.         //泛型的上限
  13.         private static void Iteratorprint(Collection<? extends Person> al) {//为什么不能直接接受子类
  14.                 Iterator<? extends Person> it=al.iterator();
  15.                 while(it.hasNext()){
  16.                         System.out.println(it.next());
  17.                 }
  18.         }

  19. }
复制代码

这个程序没有错误页没有警告,我就是想问问那两个问题,
作者: 旭辉lin    时间: 2014-9-7 09:54
  1. package aa;

  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. import java.util.HashSet;
  5. import java.util.Iterator;

  6. public class GenericDemo4 {

  7.         public static void main(String[] args) {

  8.                 ArrayList<Person> al = new ArrayList<Person>();// 为什么就可以直接接受子类,

  9.                 al.add(new Student());

  10.                 al.add(new Person());

  11.                 HashSet<Worker> hs = new HashSet<Worker>();

  12.                 hs.add(new Worker());

  13.                 Iteratorprint1(al);

  14.                 Iteratorprint(hs);

  15.         }

  16.         // 泛型的上限

  17.         private static void Iteratorprint(Collection<? extends Person> al) {// 为什么不能直接接受子类

  18.                 Iterator<? extends Person> it = al.iterator();

  19.                 while (it.hasNext()) {

  20.                         System.out.println(it.next());

  21.                 }

  22.         }
  23.         private static void Iteratorprint1(ArrayList<Person> al) {// 缩小了集合的范围

  24.                 Iterator<? extends Person> it = al.iterator();

  25.                 while (it.hasNext()) {

  26.                         System.out.println(it.next());

  27.                 }

  28.         }
  29.        
  30. }
  31. class Person{
  32.        
  33. }
  34. class Worker extends Person{
  35.        
  36. }
  37. class Student extends Person{
  38.        
  39. }
复制代码

作者: java_dream    时间: 2014-9-7 14:13
本帖最后由 java_dream 于 2014-9-7 14:29 编辑

第一个问题:子类是特殊的父类,也就是说Student类型也是Person类型;第二个问题:不清楚你说的“为什么不能直接接受子类”,这个子类是什么样的子类?可以举个例子吗?

作者: 她只是过客    时间: 2014-9-9 20:50
java_dream 发表于 2014-9-7 14:13
第一个问题:子类是特殊的父类,也就是说Student类型也是Person类型;第二个问题:不清楚你说的“为什么不 ...

第十七行, private static void Iteratorprint(Collection<? extends Person> al),<? extends Person>改成Person后就不能接受Student了,为什么?
作者: java_dream    时间: 2014-9-9 21:17
她只是过客 发表于 2014-9-9 20:50
第十七行, private static void Iteratorprint(Collection

虽然Person与Student是是父子关系,数组里可以
  1. Student[] s = new Student[2];
  2. Person[] p = s;
复制代码

但是在泛型里Collection<Person>不是Collection<Student>的父类,所以Collection<Person>参数不能接受Collection<Student>类型的实参。
作者: 冒牌高手    时间: 2014-9-11 19:44
第一个问题:因为在ArrayList的源码中,addAll方法,有一个泛型上限限定,可以接收在定义时的类及其子类。
第二个问题:可能是泛型限定的问题,除了自己的类型之外,别的不接受,这个我不太清楚。当作个规定就好了
作者: 谢建平    时间: 2014-9-12 02:02
比较器里面 如果能比较父类的对象 就肯定能比较子类的对象了 所以  (Collection<? extends Person> al  就是说参数传的是person和person的父类对象




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2