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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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()方法,不是已经继承父类的方法了么?用泛型下限怎么就不可以呢?求高手指教

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 王亚男 于 2012-4-17 00:56 编辑

下限限定的话因为牵扯到所有类的父类Object,如果你要传Object类型的话,也应是合法的,但Object中没有getName()方法,所以会编译失败。
但Person有getName()方法,所以它的子类继承了它之后就肯定会有getName()

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 koma501 于 2012-4-17 00:51 编辑

<? extends Person>这个表示?是Person是子类对象  只要继承了Person类可以 Student类继承了Person类 就可以了
<? super Student>:表示可以接收学生类型的父类型对象

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
<? super Student>意思是限制了下限为Student类,而add的时候加入的是属于Student类的类型,而不是加入Student类的未知父类类型。所以加入的元素必然要属于Student类,而加入的只能是Student类或者其子类。很拗口的,你将<? super Student>改为<? super Person>,然后add的时候传Student对象传进去试试就清楚了。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘少伟 于 2012-4-17 02:57 编辑

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

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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