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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© --_.Is’攸稀 中级黑马   /  2013-11-7 14:49  /  840 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

感觉类型提升转换不是很理解,比如
Object t=new Object();
String s=(String)r;
到底为什么可以这样,帮忙详细解释下。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

2 个回复

倒序浏览
因为任何类都继承于Object类,什么都是东西,String是东西,所以可以强转。
回复 使用道具 举报
你可以把强制转换理解成一种特殊的不安全的多态机制
Object obj = new String();
这个是标准的多态,说标准是因为 String 是 Object 的子类
所以用 obj 对象调用 Object 类所有的属性和方法必然能在 String 类中找到,
而 (String) obj 就相当于 String obj = new Object();
这个语法上必然是有问题的,
因为 String 的属性和方法 Object 基本不可能全都有,要不就不是继承了,那是克隆
但是java api提供的方法里有很多是传入一个对象,做一些动作,然后返回该对象的Object类型的,
因为这本身是标准多态的表现,是安全的,但是返回的Object类型对象通常还是需要当做原类型使用,
所以Java提供了强制转换的机制,相当于告诉你,这个事我办不了,你自己看着办啊,
放心,出问题了会抛异常的,你自己去解决就好,我就不费心了

所以总结一下的话:强制转换机制是因为需求而创造的,产生的异常编译器无能为力,
所以属于RuntimeException的范畴一般在你可以确定对象本身的引用类型时使用,
如果无法确定,最好先加上 instanceof 判断:
if (obj instanceof String)
      String str = (String)obj

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

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