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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© justin1258 中级黑马   /  2014-8-6 20:59  /  2385 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 justin1258 于 2014-8-6 22:03 编辑

比如:
String[] strings = new String[0];
Object[] objs = strings;// 不允许

类似于下面的模式不允许:
Child[] children= new Child[0];
Parent[] parents = parents;//不允许
其中Child继承于Parent。

为什么?是为了保证类型安全吗?

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 很有探索精神

查看全部评分

17 个回复

倒序浏览
这跟ArrayList<Person> al = new ArrayList<Student>();不合法是一个道理,参见http://bbs.itheima.com/forum.php ... mp;page=1#pid901151
回复 使用道具 举报
学习到了啊
回复 使用道具 举报
你理解错了吧。。。。
Person[] persons = new Child[int];这才叫向上转型
回复 使用道具 举报
本帖最后由 江苏孙浩 于 2014-8-6 21:46 编辑

可以转型吧,java8测试过了。数组是协变类型,意思是数组与数组的关系与他们存放元素种类的关系一样。比如存放的是基类和派生类的两个数组之间也基-派生的关系。
================================================
String[] strings = new String[0]; 这一句里面的";"改为英文字符的”;“
回复 使用道具 举报
fantacyleo 发表于 2014-8-6 21:20
这跟ArrayList al = new ArrayList();不合法是一个道理,参见http://bbs.itheima.com/forum.php?mod=viewth ...

我觉得像这样:ArrayList<Person> al = new ArrayList<Student>();不合法是为了保证类型安全。
如果允许这样,我要往al里添加一个工人,运行不报错,但是出现了类型安全。
而Person[] ps = new Student[]就不会出现这样的问题。
因为数组本身持有元素的类型信息,所以像ps[0] = new Worker();就会报运行时异常。

正因为上面的原因,我才纳闷为什么不允许这样。因为我知道C#里面是可以的。
回复 使用道具 举报
fantacyleo 发表于 2014-8-6 21:20
这跟ArrayList al = new ArrayList();不合法是一个道理,参见http://bbs.itheima.com/forum.php?mod=viewth ...

这方面数组和容器还是不一样的。容器的泛型确实很奇特。
回复 使用道具 举报
justin1258 发表于 2014-8-6 21:46
我觉得像这样:ArrayList al = new ArrayList();不合法是为了保证类型安全。
如果允许这样,我要往al里添 ...

你说的添加工人不存在类型安全问题,因为利用的是多态,父类引用指向子类对象,我给的链接里就举了个例子。但是ArrayList<Person> al = new ArrayList<Student>(); Person[] ps = new Student[]的问题与类型安全无关,与多态无关,是逻辑上就说不通,还拿我链接里的例子:让一个管学生的老师去管一个管中学生的老师。C#允许这样做,也不一定是你认为的原因,可能只是一个简化书写的语法糖。

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1

查看全部评分

回复 使用道具 举报
江苏孙浩 发表于 2014-8-6 21:47
这方面数组和容器还是不一样的。容器的泛型确实很奇特。

我觉得是可以解释得通的,大家可以讨论一下
回复 使用道具 举报
fantacyleo 发表于 2014-8-6 21:58
我觉得是可以解释得通的,大家可以讨论一下

对的对的,数组是这样做是合法的。是我搞错了。
不过还是明白了一个问题:这方面数组和容器还是不一样的!
回复 使用道具 举报
回答的不错
回复 使用道具 举报
fantacyleo 发表于 2014-8-6 21:58
我觉得是可以解释得通的,大家可以讨论一下

这个我是验证过的。
TiJ也专门提到过这个数组向上转型的问题:
List<String>[] ls = .....;
......
Object[] objects = ls;
回复 使用道具 举报
江苏孙浩 发表于 2014-8-6 22:13
这个我是验证过的。
TiJ也专门提到过这个数组向上转型的问题:
List[] ls = .....;

:handshake 楼主提了个伪问题,我被误导了,但说到底还是自己基础有欠缺,继续努力ing
回复 使用道具 举报
fantacyleo 发表于 2014-8-6 22:24
楼主提了个伪问题,我被误导了,但说到底还是自己基础有欠缺,继续努力ing ...

嗯,一起努力;以前看java总觉得只是很简单的语言;看了 TiJ,才发现Java确实博大精深。
回复 使用道具 举报
不会吧  貌似编译通过?
回复 使用道具 举报
本帖最后由 David.L 于 2014-8-7 01:30 编辑
fantacyleo 发表于 2014-8-6 21:57
你说的添加工人不存在类型安全问题,因为利用的是多态,父类引用指向子类对象,我给的链接里就举了个例子 ...

楼主弄错了吧,
数组之间父子类是可以的,泛型之间是不可以的

ArrayList< Person> al = new ArrayList< Student>()
单从语句上,其实怎么看都是把地址给了al,并非add集合对象,我觉得你的比喻不恰当
但是我认可你说的,可能只是一个语句简化后产生的问题
还有一点,
我个人理解是,要求泛型两边一致,是为了和泛型的上限,下限的设置区分开吧
就像有>=和=<,还得有一个只能是==吧,哈哈
可以说,上限下限是为了多态拓展复用,要求两边一致则是为了限定特定功能吧。就像修饰符final一样。

而数组之间因为本身就是父类和子类的单纯关系,没有设置上限,下限的需要。

正常都会理解错误,因为先学的是数组,所以就会有定向思维的误导。

---------------纯属个人理解,欢迎探讨~~~:)

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1

查看全部评分

回复 使用道具 举报
fantacyleo 发表于 2014-8-6 21:20
这跟ArrayList al = new ArrayList();不合法是一个道理,参见http://bbs.itheima.com/forum.php?mod=viewth ...

这是一个道理?我不相信,请说服我

点评

楼主的问题其实不存在,编译没问题的,所以没必要了  发表于 2014-8-7 11:57
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马