黑马程序员技术交流社区

标题: 高手看看 为什么<? extends Person> 为什么这样就可以 [打印本页]

作者: 魏明明    时间: 2012-4-17 00:23
标题: 高手看看 为什么<? extends Person> 为什么这样就可以
import java.util.*;

class GenericDemo
{
        public static void main(String[] args)
        {
                ArrayList<Person> al = new ArrayList<Person>();
                al.add(new Person("abc1"));
                al.add(new Person("abc2"));
                al.add(new Person("abc3"));
                printColl(al);
        }
        public static void printColl(ArrayList<? super Student>/*<? extends Person>为什么这样就可以*/ al)
        {
                Iterator<? super Student>/*<? extends Person>为什么这样就可以*/  it = al.iterator();

                while (it.hasNext())
                {
                        System.out.println(it.next().getName());
                }
        }

}

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);
        }

}
<? super Student>这样就找不到getName()方法,不是已经继承父类的方法了么?用泛型下限怎么就不可以呢?求高手指教

作者: 王亚男    时间: 2012-4-17 00:47
本帖最后由 王亚男 于 2012-4-17 00:56 编辑

下限限定的话因为牵扯到所有类的父类Object,如果你要传Object类型的话,也应是合法的,但Object中没有getName()方法,所以会编译失败。
但Person有getName()方法,所以它的子类继承了它之后就肯定会有getName()
作者: 高铭    时间: 2012-4-17 00:48
本帖最后由 koma501 于 2012-4-17 00:51 编辑

<? extends Person>这个表示?是Person是子类对象  只要继承了Person类可以 Student类继承了Person类 就可以了
<? super Student>:表示可以接收学生类型的父类型对象
作者: 蒋亮    时间: 2012-4-17 01:28
<? super Student>意思是限制了下限为Student类,而add的时候加入的是属于Student类的类型,而不是加入Student类的未知父类类型。所以加入的元素必然要属于Student类,而加入的只能是Student类或者其子类。很拗口的,你将<? super Student>改为<? super Person>,然后add的时候传Student对象传进去试试就清楚了。
作者: 刘少伟    时间: 2012-4-17 02:53
本帖最后由 刘少伟 于 2012-4-17 02:57 编辑

<? super Student>向下限定到Student类,向上可以到Object(Student->Person->Object),而getName是从Person类定义的,所以照这样设定参数,假如传进去的参数是Object类型,实际上它并没有getName方法,所以编译会出错,而<? extends Person>,是继承了Person的子类,因为getName是从Person类定义,因此它的子类都会继承或重载这个方法,调用时就不会出错。
作者: 魏明明    时间: 2012-4-17 11:03
了解了 ,谢谢




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