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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 茶念小手 中级黑马   /  2013-8-11 09:25  /  1146 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 茶念小手 于 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()方法而报错,难道泛型不能调用父类方法?

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

5 个回复

倒序浏览
把代码 在详细的贴出来,是可以调用父类的方法的
回复 使用道具 举报
本帖最后由 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不一定有这个方法了吧。
回复 使用道具 举报
受到上一帖的启发,我仔细琢磨了一下:
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());

     }
回复 使用道具 举报
亲,如问题已解决请将分类的未解决改为已解决。

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


保持队形,谢谢合作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马