黑马程序员技术交流社区

标题: 泛型问题!! [打印本页]

作者: 茶念小手    时间: 2013-8-11 09:25
标题: 泛型问题!!
本帖最后由 茶念小手 于 2013-8-14 21:21 编辑
  1. public static void printColl(TreeSet<? extends Person> al)
  2. {
  3.        Iterator<? extends Person> it = al.iterator();
  4.         while(it.hasNext())
  5.         {
  6.               System.out.println(it.next().getName());
  7.         }
  8. }
复制代码
在此处getName()是Student继承的Person中的方法。不上示方法参数(TreeSet<? extends Person> al ) 变成了(TreeSet<? super Student> al)后,就会因为调用getName()方法而报错,难道泛型不能调用父类方法?
作者: ⑷嚸V恱    时间: 2013-8-11 09:48
把代码 在详细的贴出来,是可以调用父类的方法的
作者: xscn    时间: 2013-8-11 10:09
本帖最后由 xscn 于 2013-8-11 10:12 编辑

TreeSet<? extends Person> al这句话表示该TreeSet对象中只能够装Person对象以及Person的子类,getName()是Person中的方法,子类继承了Person当然能够使用getName()这个方法。编译当然没问题。
而改为TreeSet<? super Student> al,这代表TreeSet中只能装Student或他的父类的对象,Student对象和Person对象能够使用getName()这个方法,但是Person的父类就不能保证能使用这个方法吧,只指定了下限,没有指定上限,往上能追溯到Object呢,Object不一定有这个方法了吧。
作者: 清心玉质    时间: 2013-8-11 15:58
受到上一帖的启发,我仔细琢磨了一下:
TreeSet<? extends Person> 表示treeSet可以接收Person及Person的子类型,Student继承了父类,自然就有getName方法。
TreeSet<? super Student>表示treeSet可以接收Student及Student的父类,Student的所有父类不是都有getName方法,无法识别。
如果想使用<? super Student>实现getName方法,可以转换类型,代码如下:
public static void print(ArrayList<? super Student> al){

        
              Iterator<? super Student> it = (Iterator) al.iterator();

                       while(it.hasNext())

                      {

                    System.out.println(( (Person) it.next()).getName());

     }

作者: 以防万一    时间: 2013-8-13 22:17
亲,如问题已解决请将分类的未解决改为已解决。

以后的问题贴也要及时更改分类哦~


保持队形,谢谢合作




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