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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Zero霖 中级黑马   /  2014-4-13 17:46  /  1065 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码如下:
import java.util.*;
class Person
{
        private String name;
        Person(String name)
        {
                this.name=name;
        }
        public String getName()
        {
                return name;
        }
}
class Student extends Person
{
        Student(String name)
        {
                super(name);
        }
}
class GenericDemo4_3
{
        public static void main(String[] args)
        {
                ArrayList<Person> a1=new ArrayList<Person>();
                a1.add(new Person("abc1"));
                a1.add(new Person("abc2"));
                a1.add(new Person("abc3"));
                printColl1(a1);
                System.out.println("---------------------");
                ArrayList<Student> a2=new ArrayList<Student>();
                a2.add(new Student("abc--1"));
                a2.add(new Student("abc--2"));
                a2.add(new Student("abc--3"));
                printColl1(a2);                printColl2(a2);
               
        }
        //上限定
        public static void printColl1(ArrayList<? extends Person> a1)
        {
                Iterator<? extends Person> it=a1.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next().getName());
                }
        }
        //下限定
        public static void printColl2(ArrayList<? super Student> a1)
        {
                Iterator<? super Student> it=a1.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next().getName());
                }
        }
}

为什么编译报错:
---------- Java编译 ----------
GenericDemo4_3.java:61: 错误: 找不到符号
                        System.out.println(it.next().getName());
                                                    ^
  符号:   方法 getName()
  位置: 类 Object
1 个错误
理解不了这个错误,下限定的是要么是Student类要么是Student的父类,而且Student继承了父类的getName()方法,为什么说找不到getName()方法,求解……



评分

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

查看全部评分

4 个回复

倒序浏览
Object是所有类的超类,所以在下限定时,Object视作Student类的父类,而Object中没有getName()方法
回复 使用道具 举报
楼主遇到的问题我在学习中也遇到过,只需要在遍历的时候向下转型即可,修改代码如下
  1.         public static void printColl2(ArrayList<? super Student> a1)
  2.         {
  3.            Iterator<? super Student> it=a1.iterator();
  4.            while(it.hasNext())
  5.            {
  6.                Person p = (Person)it.next();          // 在这里向下转型,Object 类中没有 getName() 方法,将 Object  强转为 Person 即可。
  7.                System.out.println(p.getName());
  8.            }
  9.         }
复制代码






评分

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

查看全部评分

回复 使用道具 举报
呆呆沙师妹 发表于 2014-4-13 18:01
Object是所有类的超类,所以在下限定时,Object视作Student类的父类,而Object中没有getName()方法 ...

可是接收的a2是student,为什么能这样?
回复 使用道具 举报
Zero霖 发表于 2014-4-14 13:59
可是接收的a2是student,为什么能这样?

创建a2集合时作了范型限定,保证a2的存储对象是Student对象。
但静态方法printColl2(ArrayList<? super Student> a1)这里定义了广泛的限定,将printColl2对象接收范围扩大为Student类及其父类对象,而Iterator<? super Student> it=a1.iterator();语句,等同于Iterator<Object> it=a1.iterator(); 即用迭代器取出的a2集合中的对象被提升成了Object型。
这时想使用getName()方法必须对其进行向下转型。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马