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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© izwj 中级黑马   /  2012-3-25 16:57  /  2011 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;

class Person
{
        private String name;
        Person(String name)
        {
                this.name=name;
        }
        String getName()
        {
                return name;
        }
}
class Worker extends Person
{
        Worker(String name)
        {
                super(name);
        }
}
class GenericDemo5
{
        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"));
                print(al);

                ArrayList<Worker> al2=new ArrayList<Worker>();
                al2.add(new Worker("abc...1"));
                al2.add(new Worker("abc...2"));
                al2.add(new Worker("abc...3"));
                print(al2);
        }
        static void print(ArrayList<? extends Person>al)//改成<? super Worker>al 怎么不行啊???
        {
                Iterator<? extends Person> it=al.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next().getName());
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

8 个回复

倒序浏览
extends继承,super()方法调用父类方法,你这? super Worker还真看不懂
回复 使用道具 举报
应该可以改成<? super Worker>,你把错误发上来看看~
回复 使用道具 举报
黑马程序员_毕向东_Java基础视频教程第15天-12-集合框架(泛型限定).avi http://dl.dbank.com/c0u1xih8z8,中的例子,老师没演示出来,我试了试用super代替extends没成功,不知道怎么回事,应该可以的。
回复 使用道具 举报
你的代码是可以运行的,没有问题,你仔细看看jvm给你的错误提示
回复 使用道具 举报
本帖最后由 izwj 于 2012-3-25 17:30 编辑

就是改成这样。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
import java.util.*;

class Person
{
        private String name;
        Person(String name)
        {
                this.name=name;
        }
        String getName()
        {
                return name;
        }
}
class Worker extends Person
{
        Worker(String name)
        {
                super(name);
        }
}
class GenericDemo5
{
        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"));
                print(al);

                ArrayList<Worker> al2=new ArrayList<Worker>();
                al2.add(new Worker("abc...1"));
                al2.add(new Worker("abc...2"));
                al2.add(new Worker("abc...3"));
                print(al2);
        }
        /*static void print(ArrayList<? extends Person>al)
        {
                Iterator<? extends Person> it=al.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next().getName());
                }
        }*/
        static void print(ArrayList<? super Worker>al)
        {
                Iterator<? super Worker> it=al.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next().getName());
                }
        }
}
为啥不行呢????????????????????????????????????
回复 使用道具 举报
izwj 中级黑马 2012-3-25 17:29:03
7#
为啥不行呢
回复 使用道具 举报
adison 黑马帝 2012-3-25 19:02:53
8#
对于这个问题,我是这样理解的,因为泛型限定 ? super T:可以接收T类型或者T的父类型,那就是说可以接受Object类,而 Iterator<? super Worker> it=al.iterator();这个语句中的<? super Worker> 因为仅仅知道要操作Worker类或其父类,所以为了不出错,会自动将接收的元素变成Object类型,那么因为Object类中没有getName()方法,所以编译失败,要代码可以运行,就需要将类型强转一下
import java.util.*;

class Person
{
        private String name;
        Person(String name)
        {
                this.name=name;
        }
        String getName()
        {
                return name;
        }
}
class Worker extends Person
{      
      
        Worker(String name)
        {
                super(name);
        }
        
}
class GenericDemo5
{
        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"));
                print(al);

               ArrayList<Worker> al2=new ArrayList<Worker>();
                al2.add(new Worker("abc...1"));
                al2.add(new Worker("abc...2"));
                al2.add(new Worker("abc...3"));
                print(al2);
        }
        static void print(ArrayList<? super Worker>al)
        {
                Iterator<? super Worker> it=al.iterator();
                while(it.hasNext())
                {      
                         Person p=(Person)it.next();
                        System.out.println(p.getName());
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
izwj 中级黑马 2012-3-25 19:21:45
9#
adison 发表于 2012-3-25 19:02
对于这个问题,我是这样理解的,因为泛型限定 ? super T:可以接收T类型或者T的父类型,那就是说可以接受O ...

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