java的泛型中,List中泛型定义为父类的,为什么可以添加继承类(子类的)?

四月的萤火之光 2017-11-06 10:47:11
package paradigm;
import java.util.ArrayList;
import java.util.List;
/*
* 其中:Person是Student和Worker的父类
*
* java的泛型中,List中泛型定义为父类的,为什么可以添加继承类(子类的)?
*/
public class Test {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
list.add(new Student());//为什么此行代码没有报错?
list.add(new Person());
list.add(new Person());
list.add(new Worker());//为什么此行代码没有报错?
}

}
...全文
2120 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
前途未达 2019-06-22
  • 打赏
  • 举报
回复
引用 11 楼 qq_28967251 的回复:
java编程思想第四版,怎么解释?
我发现这本大名鼎鼎的书里面例子竟然是错的……编译不会报错,执行也正常,apple成功的放入了List<Fruit>里面…… 最近在研究jdk8的stream接口,发现了很多跟我印象相悖的泛型使用,看了好多博客,现在看来还是得自己敲一遍代码试试才保险
weixin_43736145 2019-01-21
  • 打赏
  • 举报
回复
多态 ,,,,,,,,,,。。。
qq_28967251 2018-11-05
  • 打赏
  • 举报
回复


java编程思想第四版,怎么解释?
tanling8334 2017-11-06
  • 打赏
  • 举报
回复
这不是理所当然吗?任何一个子类的对象必然是一个父类对象。反过来就不一定了
  • 打赏
  • 举报
回复
谢谢各位的回答,本人第一次结帖,分数加错了,抱歉
  • 打赏
  • 举报
回复
引用 8 楼 shangcunshanfu 的回复:
Person p=new Student(); List list=new ArrayList(); 这两句话成立并不表示 List<Person> list=new ArrayList<Student>();就成立,因为尖括号里跟的是类型,则不是对象 对于添加list.add(new Student()); add(E e)括号里跟的是一个对象,对象当然可以使用多态了,所以是成立的
谢谢回答,明白了
shangcunshanfu 2017-11-06
  • 打赏
  • 举报
回复
Person p=new Student(); List list=new ArrayList(); 这两句话成立并不表示 List<Person> list=new ArrayList<Student>();就成立,因为尖括号里跟的是类型,则不是对象 对于添加list.add(new Student()); add(E e)括号里跟的是一个对象,对象当然可以使用多态了,所以是成立的
luluxiu0jc 2017-11-06
  • 打赏
  • 举报
回复
这种属于类型自动转换,父类引用可以指向子类的实例,这是多态的表现之一。 你可以这样理解:假设车是父类,他有单车的子类,也有汽车的子类。这时你有一个专门放车的仓库,那么这时无论汽车还是单车都可以放进去
lifewell1 2017-11-06
  • 打赏
  • 举报
回复
骚年 你不知道List list = new ArrayList();吗 Arrarylist 的父类list
qq_39912309 2017-11-06
  • 打赏
  • 举报
回复
多态……
tanling8334 2017-11-06
  • 打赏
  • 举报
回复
引用 2 楼 a15920804969 的回复:
[quote=引用 1 楼 tanling8334 的回复:] 这不是理所当然吗?任何一个子类的对象必然是一个父类对象。反过来就不一定了
本人菜鸟一枚,不好意思我还是不懂! 理由如下: 因为:List<Person> list = new ArrayList<Student>();是错的,所以我就对Java继承的内容有点疑惑了。 因为list的add方法中:jdk中是这样的add(E e) ,而此时对应的是List<E>。 所以代码为:List<Person> list = new ArrayList<Person>(); 我就以为add方法只能添加Person类型的对象,即:list.add(new Person()); 并且认为添加其他子类对象时错的:list.add(new Student());//自己认为这段代码编译错误, 因为Student类型与Person类型不一致。 可是,事实却是list.add(new Student());可以,这是为什么呢? 难道不是:Person才是E,Student不是E? 为什么可以呢? 难道是此时的<E> 等价于 <? extends E>泛型上限吗? 可以给我解释一下吗?我很想知道其中的原因! [/quote] 这么说吧,任何一个父类的公共方法肯定能在子类中找到同样的API,当然实现不一定一样,但API必然是一样的。所以可以像操作父类对象一样操作子类对象。也就是说任何一个子类对象必然是父类的对象。抛开语言从概念上也好理解,人是父类,男人和女人是子类,那么任何一个男人必然是人,但不是任何一个人都是男人。这个好理解吧 至于泛型,其实和声明的逻辑是一样的Person p=new Student()合法,自然ArrayList<Person>能够加Student就合法。 而List<Person> list=new ArrayList<Student>()不合法,你可以这么理解,你的实现能狗满足声明的所有要求吗?声明是是List<Person>,要求他能加入所有的Person,但你只给了一个职能加Student的实现,明显满足不了声明的要求。编译时的类型检测是以声明为准的
繁华终归落尽 2017-11-06
  • 打赏
  • 举报
回复
泛型前后的类型要保持一致!
  • 打赏
  • 举报
回复
引用 1 楼 tanling8334 的回复:
这不是理所当然吗?任何一个子类的对象必然是一个父类对象。反过来就不一定了
本人菜鸟一枚,不好意思我还是不懂! 理由如下: 因为:List<Person> list = new ArrayList<Student>();是错的,所以我就对Java继承的内容有点疑惑了。 因为list的add方法中:jdk中是这样的add(E e) ,而此时对应的是List<E>。 所以代码为:List<Person> list = new ArrayList<Person>(); 我就以为add方法只能添加Person类型的对象,即:list.add(new Person()); 并且认为添加其他子类对象时错的:list.add(new Student());//自己认为这段代码编译错误, 因为Student类型与Person类型不一致。 可是,事实却是list.add(new Student());可以,这是为什么呢? 难道不是:Person才是E,Student不是E? 为什么可以呢? 难道是此时的<E> 等价于 <? extends E>泛型上限吗? 可以给我解释一下吗?我很想知道其中的原因!

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧