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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zcbyzcb 中级黑马   /  2013-6-16 10:50  /  1344 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

泛型的限定中,<? extends Person>表示的是传入的是Person的子类都可以接收,那<? super Student>的是student的父类应该都可以接收了,可是出问题了。
  1. import java.util.*;
  2. class Person
  3. {
  4.         private String name;
  5.         Person(String name)
  6.         {
  7.                 this.name=name;
  8.         }
  9.         public String getName()
  10.         {
  11.                 return name;
  12.         }
  13. }

  14. class Student extends Person
  15. {
  16.         //private String name;
  17.         Student(String name)
  18.         {
  19.                 super(name);
  20.         }

  21. }

  22. class GenericDemo6  
  23. {
  24.         public static void main(String[] args)
  25.         {
  26.                 ArrayList <Person>al=new ArrayList<Person>();
  27.                 al.add(new Person("ajfi"));
  28.                 al.add(new Person("fjia"));
  29.                 al.add(new Person("daff"));
  30.                 ArrayList <Student>al1=new ArrayList<Student>();
  31.                 al1.add(new Student("121"));
  32.                 al1.add(new Student("122"));
  33.                 al1.add(new Student("123"));
  34.                 print(al);
  35.                 print(al1);
  36.         }

  37.         public static void print(ArrayList <? super Student> al)
  38.         {
  39.                 Iterator < ? super Student> it=al.iterator();
  40.                 while(it.hasNext())
  41.                 {
  42.                         System.out.println(it.next().getName());
  43.                 }

  44.         }
  45.        
  46. }
复制代码
编译提示找不到符号,求解?

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

6 个回复

倒序浏览
public static void print(ArrayList <? super Student> al)
        {
                Iterator < ? super Student> it=al.iterator();
                while(it.hasNext())
                {
                        Person p = (Person)it.next();
                        System.out.println(p.getName());
                }

        }
        

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
  1. public static void print(ArrayList <? super Student1> al)
  2.         {
  3.             Iterator < ? super Student1> it=al.iterator();
  4.             while(it.hasNext())
  5.             {
  6.                <font color="red"> //System.out.println(it.next().getName());</font>
  7.                 System.out.println(((Person)it.next()).getName());
  8.             }
  9.         }
复制代码
以上红色标注的代码有误,it.next()返回的是Object类型的,所以不能调用getName()方法

应该强制类型转换为Person类型,(Person) it.next(),然后再调用getName()方法就行了。


评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
Heart 发表于 2013-6-16 11:58
以上红色标注的代码有误,it.next()返回的是Object类型的,所以不能调用getName()方法

应该强制类型转换 ...

奥,对,Object是所有类的父类,<? super Student>向上拓展在这儿试用还真是有点不合适。
回复 使用道具 举报
*要往集合中存储集合时,也就是要拿出来集合内的对象来使用其特定方法时,这个集合参数用泛型上限。----存对象的集合参数用上限
*要把集合中元素取出来时,取对象的这个东西的参数用泛型下限。-------取对象的参数集合用下限
你这个集合是存对象的,当然得用泛型上限,下限就错了

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
对于下限限定只对参数可行,而对方法不可行
回复 使用道具 举报
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马