黑马程序员技术交流社区

标题: 关于泛型限定的下限定问题 [打印本页]

作者: Zero霖    时间: 2014-4-13 17:46
标题: 关于泛型限定的下限定问题
代码如下:
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()方法,求解……




作者: 呆呆沙师妹    时间: 2014-4-13 18:01
Object是所有类的超类,所以在下限定时,Object视作Student类的父类,而Object中没有getName()方法
作者: wangkerui    时间: 2014-4-13 18:18
楼主遇到的问题我在学习中也遇到过,只需要在遍历的时候向下转型即可,修改代码如下
  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.         }
复制代码







作者: Zero霖    时间: 2014-4-14 13:59
呆呆沙师妹 发表于 2014-4-13 18:01
Object是所有类的超类,所以在下限定时,Object视作Student类的父类,而Object中没有getName()方法 ...

可是接收的a2是student,为什么能这样?
作者: 呆呆沙师妹    时间: 2014-4-14 19:33
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()方法必须对其进行向下转型。




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