A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 她只是过客 中级黑马   /  2014-9-6 22:00  /  1521 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

这个程序没有错误页没有警告,我就是想问问那两个问题,

6 个回复

倒序浏览
  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. }
复制代码
回复 使用道具 举报 1 0
本帖最后由 java_dream 于 2014-9-7 14:29 编辑

第一个问题:子类是特殊的父类,也就是说Student类型也是Person类型;第二个问题:不清楚你说的“为什么不能直接接受子类”,这个子类是什么样的子类?可以举个例子吗?
回复 使用道具 举报
java_dream 发表于 2014-9-7 14:13
第一个问题:子类是特殊的父类,也就是说Student类型也是Person类型;第二个问题:不清楚你说的“为什么不 ...

第十七行, private static void Iteratorprint(Collection<? extends Person> al),<? extends Person>改成Person后就不能接受Student了,为什么?
回复 使用道具 举报
她只是过客 发表于 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>类型的实参。
回复 使用道具 举报
第一个问题:因为在ArrayList的源码中,addAll方法,有一个泛型上限限定,可以接收在定义时的类及其子类。
第二个问题:可能是泛型限定的问题,除了自己的类型之外,别的不接受,这个我不太清楚。当作个规定就好了
回复 使用道具 举报
比较器里面 如果能比较父类的对象 就肯定能比较子类的对象了 所以  (Collection<? extends Person> al  就是说参数传的是person和person的父类对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马