黑马程序员技术交流社区

标题: ArrayList<Person> al = new ArrayList<Student>();为什么错误? [打印本页]

作者: ysdolls    时间: 2014-8-3 21:27
标题: ArrayList<Person> al = new ArrayList<Student>();为什么错误?
本帖最后由 ysdolls 于 2014-8-3 22:12 编辑

ArrayList<Person> al = new ArrayList<Student>();为什么错误?
必须要两边一样啊?真的确实是多态呀。。。
老毕讲的 猪 动物 没听懂怎么办。。。
求帮忙指点下 哈
作者: 江苏孙浩    时间: 2014-8-3 21:35
正确写法是 ArrayList<? extends Person> al = new ArrayList<Student>()
这里主要是认识到,ArrayList<Person> 和 ArrayList<Student>的关系。我觉得,关键在于,前者不是后者的基类,ArrayList<Student> 两个都是ArrayList类。
举个例子,比如Person有两个派生类Student和Teacher。定义 ArrayList<Student> arrS,它里面只能存放Student类和其派生类的对象。但是定义 ArrayList<Person> arrP,里面可以存放Person类和其派生类对象,包括Teacher类和Teacher类的派生类。
作者: Peach2014    时间: 2014-8-3 21:44
多态理解(武侠版)
http://bbs.itheima.com/thread-134671-1-1.html
(出处: 黑马程序员IT技术论坛)
可以参考我这个去理解一下!
作者: ysdolls    时间: 2014-8-3 21:45
江苏孙浩 发表于 2014-8-3 21:35
正确写法是 ArrayList

亲,您说的这个我是了解的
我主要问的只是rrayList<Person> al = new ArrayList<Student>();为什么错误?
不改变代码 我想知道错在哪里了
作者: fantacyleo    时间: 2014-8-3 22:09
ysdolls 发表于 2014-8-3 21:45
亲,您说的这个我是了解的
我主要问的只是rrayList al = new ArrayList();为什么错误?
不改变代码 我想 ...

我猜你想说:一个装Person的容器应该可以装Student。
这是对的,但关键是这句话意味着什么。这句话的意思是你可以这样做:
  1. ArrayList<Person> al = new ArrayList<Person>();
  2. al.add(new Student());
复制代码

这叫用装Person的容器装Student

而ArrayList<Person> al = new ArrayList<Student>();的意思是:让一个引用装Person的容器的变量去操作(指向)一个装Student的容器,这显然是不合适的。就好比,一个管学生的老师,你可以让他管大学生、中学生、小学生,但你让他去管一个管中学生的老师,这就不对了吧
作者: 江苏孙浩    时间: 2014-8-3 22:09
ysdolls 发表于 2014-8-3 21:45
亲,您说的这个我是了解的
我主要问的只是rrayList al = new ArrayList();为什么错误?
不改变代码 我想 ...

因为两者不是一个类型的List。但是两个都是List,他们也不是基类-派生类的关系。为什么能相互赋值呢。
就像Class<Person> 和 Class<Student> 能相互赋值吗?
作者: ysdolls    时间: 2014-8-3 22:12
Peach2014 发表于 2014-8-3 21:44
多态理解(武侠版)
http://bbs.itheima.com/thread-134671-1-1.html
(出处: 黑马程序员IT技术论坛)

亲 ,你那个帖子讲的我都知道,可是谢谢你的帖子提醒了我
*Person per = new Student();
这个Person 不能用子类的特有方法
ArrayList<Person> al 中的al 可能调用 Student的方法吧,所以不可以这么写
作者: ysdolls    时间: 2014-8-3 22:21
哦哦 懂了,谢谢亲们耐心解答了
作者: guanxiangliang    时间: 2014-8-3 22:39
泛型有点忘了,不过泛型前后应该一致吧,多态可以吗?
作者: 刷新召唤    时间: 2014-8-3 22:55
ysdolls 发表于 2014-8-3 21:45
亲,您说的这个我是了解的
我主要问的只是rrayList al = new ArrayList();为什么错误?
不改变代码 我想 ...

张孝祥高薪技术说到的泛型有讲到这个问题
作者: paozhuanyinyu    时间: 2014-8-3 23:51
Person应该是父类吧,父类调用了子类导致错误
作者: 曾翀    时间: 2014-8-4 15:54
我是来打酱油的




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