黑马程序员技术交流社区

标题: 毕老师视频中的小问题 [打印本页]

作者: izwj    时间: 2012-3-25 16:57
标题: 毕老师视频中的小问题
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());
                }
        }
}
作者: 田斌    时间: 2012-3-25 17:01
extends继承,super()方法调用父类方法,你这? super Worker还真看不懂
作者: 万正    时间: 2012-3-25 17:02
应该可以改成<? super Worker>,你把错误发上来看看~
作者: izwj    时间: 2012-3-25 17:10
黑马程序员_毕向东_Java基础视频教程第15天-12-集合框架(泛型限定).avi http://dl.dbank.com/c0u1xih8z8,中的例子,老师没演示出来,我试了试用super代替extends没成功,不知道怎么回事,应该可以的。
作者: 丰亚彬    时间: 2012-3-25 17:22
你的代码是可以运行的,没有问题,你仔细看看jvm给你的错误提示
作者: izwj    时间: 2012-3-25 17:28
本帖最后由 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
为啥不行呢
作者: adison    时间: 2012-3-25 19:02
对于这个问题,我是这样理解的,因为泛型限定 ? 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());
                }
        }
}
作者: izwj    时间: 2012-3-25 19:21
adison 发表于 2012-3-25 19:02
对于这个问题,我是这样理解的,因为泛型限定 ? super T:可以接收T类型或者T的父类型,那就是说可以接受O ...

非常感谢!




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