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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© never615 中级黑马   /  2014-5-26 16:13  /  2809 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class GenericDemo6
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 ArrayList<Person> a=new ArrayList<Person>();
  6.                 a.add(new Person("lisi01"));
  7.                 a.add(new Person("lisi02"));
  8.                 a.add(new Person("lisi03"));
  9.                 a.add(new Person("lisi04"));

  10.                 ArrayList<Student> s=new ArrayList<Student>();
  11.                 s.add(new Student("lisi001"));
  12.                 s.add(new Student("lisi002"));
  13.                 s.add(new Student("lisi003"));
  14.                 s.add(new Student("lisi004"));
  15.                 print(s);
  16.         }
  17.         public static void print(ArrayList<? super Student> a)  
  18.         {
  19.                 Iterator<? super Student> it=a.iterator();
  20.                 while (it.hasNext())
  21.                 {
  22.                         System.out.println(it.next().getName());
  23.                 }
  24.         }
  25. }
  26. class Person
  27. {
  28.         private String name;
  29.         Person(String name)
  30.         {
  31.                 this.name=name;
  32.         }
  33.         public String getName()
  34.         {
  35.                 return name;
  36.         }
  37. }
  38. class Student extends Person
  39. {
  40.         Student(String name)
  41.         {
  42.                 super(name);
  43.         }
  44. }
复制代码
这就是老师视频中的例子,写成<? extends person>就没问题   写成<? super Student>就报错     ? extends E: 可以接收E类型或者E的子类型。上限。
? super E: 可以接收E类型或者E的父类型。下限      这个也可以接受E类型啊

报的错误是:
GenericDemo6.java:55: 错误: 找不到符号
                        System.out.println(it.next().getName());
                                                    ^
  符号:   方法 getName()
  位置: 类 Object



评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
我查API ArrayList(Collection<? extends E> c)
          构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。   ArrayList里面构造方法只有 ?extends E   是不是这里不能写 super啊。。。。。老师在视频里面写了一下super的,然后说和那个一样就不演示了,,
回复 使用道具 举报
ArrayList<E>上面定义的泛型是E,所以他只能接受E类型或者E的子类
就好像ArrayList<Person>  你只能往里面添加ArrayList<Person的子类泛型>不能添加ArrayList<Person的父类型>  跟覆盖方法的返回类型可以时被继承方法返回类型的子类一样道理。
所以ArrayList<E>里面只能传ArrayList(Collection<? extends E> c)


评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 很给力!

查看全部评分

回复 使用道具 举报
TreeSet(Comparator<? super E> comparator)
          构造一个新的空 TreeSet,它根据指定比较器进行排序。
ArrayList(Collection<? extends E> c)
          构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
定义了三个类,Student和Worker继承Person

然后写一个比较器,要让Student和Worker都能用,就必须在比较器里写<Person>写<? extends Person>报错
然后看一楼的例子, public static void print(ArrayList<? extends Person> a)   这必须写t<? extends Person>才能运行,写Person报错;

到底什么时候写<? extends XX><? super XX><父类>什么时候写什么啊?????????????

这里的定义TreeSet(Comparator<? super E> comparator)  <>里面表示什么啊?表示里面只写一个元素,然后这个元素的父类都能用了吗?还是表示在用的时候要<? super E>这样写出来?{:2_43:}
回复 使用道具 举报
136616244 发表于 2014-5-27 01:11
ArrayList上面定义的泛型是E,所以他只能接受E类型或者E的子类
就好像ArrayList  你只能往里面添加ArrayLis ...

TreeSet(Comparator<? super E> comparator)
          构造一个新的空 TreeSet,它根据指定比较器进行排序。
ArrayList(Collection<? extends E> c)
          构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
定义了三个类,Student和Worker继承Person

然后写一个比较器,要让Student和Worker都能用,就必须在比较器里写<erson>写<? extends Person>报错
然后看一楼的例子, public static void print(ArrayList<? extends Person> a)   这必须写t<? extends Person>才能运行,写Person报错;

到底什么时候写<? extends XX><? super XX><父类>什么时候写什么啊?????????????

这里的定义TreeSet(Comparator<? super E> comparator)  <>里面表示什么啊?表示里面只写一个元素,然后这个元素的父类都能用了吗?还是表示在用的时候要<? super E>这样写出来?
回复 使用道具 举报
我看第一遍视频的时候第也没明白,看第二遍才明白,
回复 使用道具 举报 1 0

时间久远,估计你自己已经解决这个问题了。
我认为,1L例子中之所以不能写成<? super Student>是因为,这表示传进来的是Student的父类型,而Student的父类不仅仅你写的Person类,比如说最明显的Object类也是Student类的父类。然而,你下面代码中所调用的getName()是只有Person类及其子类才有的,Student类的其他父类,如Object类就没有此方法。当然报错。
而改成<? extends person>,就没有上述问题。
回复 使用道具 举报 2 0
ddewym123 发表于 2014-7-24 11:18
时间久远,估计你自己已经解决这个问题了。
我认为,1L例子中之所以不能写成 ...

感觉你说的不怎么样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马