想破头啦,关于父类强转成子类的问题

叫我小林吧 2012-07-18 11:33:45

public class Demo {

public static void main(String[] args){
Fu f = new Fu();
Zi z =(Zi)Fu();
}

}
class Fu{

}
class Zi extends Fu{

}

为什么这样就错误?而下面这样却可以

Element a = (Element) document.getElementsByTagName("a").item(0);//此处返回Node

Element 也是Node的子类,为什么他就可以强转呢?而上面就不行?
...全文
8917 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xianlaowu 2014-08-31
  • 打赏
  • 举报
回复
必须一个父对象的数组,里面保存了不同的子对象。如果最后要讲数组中取出的父对象转换成需要的子对象,要使用as , ()这种转换依然报错。正确的写法。 if entity.bImageFile { tableContents.append(entity as ATDesktopImageEntity) }
zhuzeitou 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

向上转型是安全的 ,向下转型 ,那么子类中有的属性父类中没有 ,就属于不安全了
[/Quote]
对的,手滑了……
brightyq 2012-07-19
  • 打赏
  • 举报
回复
也不是不能转,毕竟,楼主用的是强制转换。只是代码写的有问题。

改成:

Fu f = new Fu();
Zi z =(Zi)f;


Zi z =(Zi)Fu(); 这种写法,实在是没有这么写的。
sdojqy1122 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

Element a = (Element) document.getElementsByTagName("a").item(0);//此处返回Node
我想,是应该你的 document.getElementsByTagName("a")返回是一个 Element数组,不用是 用Node类型引用指向 Element对象。所以可以安全强转到Element。

而你的
Fu f = new……
[/Quote]
纠正错字
返回是一个 Element数组,不过是 用Node类型引用指向Element对象。
sdojqy1122 2012-07-19
  • 打赏
  • 举报
回复
Element a = (Element) document.getElementsByTagName("a").item(0);//此处返回Node
我想,是应该你的 document.getElementsByTagName("a")返回是一个 Element数组,不用是 用Node类型引用指向 Element对象。所以可以安全强转到Element。

而你的
Fu f = new Fu();
Zi z =(Zi)f;
这个会报错强制转型错误,除非 Fu f = new zi();或者new 一个zi的子类。这个时候你强制应该是没有问题的。
jlu_lamp_lamp 2012-07-19
  • 打赏
  • 举报
回复
向上转型是没问题的
向下转型一定要小心,尽量在转之前做一个判断,看是否能转
不然就会出现异常
五哥 2012-07-19
  • 打赏
  • 举报
回复
向上转型是安全的 ,向下转型 ,那么子类中有的属性父类中没有 ,就属于不安全了
gerforce 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

Java code
Fu f = new Zi();
Zi z =(Zi)Fu();


要强转的话应该是这样的
[/Quote]
Fu f = new Zi();
Zi z = (Zi)f;
应该这样写吧?
linghu0619 2012-07-19
  • 打赏
  • 举报
回复
Zi z =(Zi)Fu();
无语的写法。
gerforce 2012-07-19
  • 打赏
  • 举报
回复
要是想将一个父类转化成一个子类,只有当父类本身指向的就是一个子类对象(利用多态),只有这种情况,才能将父类reference强制转化为子类reference
  • 打赏
  • 举报
回复
4楼写的对
newbie_Lee 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

(Zi)Fu() 这种写法不对。你要转换的是对象类型,要么是(Zi)new Fu() 要么是(Zi)f
这样是强制将父类转化为子类
[/Quote]

4楼说的对
「已注销」 2012-07-19
  • 打赏
  • 举报
回复
不知道楼上写的啥玩意
zhuzeitou 2012-07-19
  • 打赏
  • 举报
回复
Fu f = new Zi();
Zi z =(Zi)Fu();


要强转的话应该是这样的
nmyangym 2012-07-19
  • 打赏
  • 举报
回复
不明白,没有创建子类,怎么会能强转为子类?
在多态用法下,声明父类,创建子类,这时可将父类强转为子类。上述代码根本就没有创建子类,怎么会强转呢?
tr106501 2012-07-19
  • 打赏
  • 举报
回复
撇开语法错误。
上面f的实际类型是Fu,强制转Zi必然报错。如果你写Fu f = new Zi(); Zi zi = (Zi) f; 运行就不会报错。
下面如果item(0)的实际类型是Element,强转成Element不会报错。但如果item(0)的类型是Node或者Node的其他子类,强转成Element也是会报错的。所以你下面的代码没报错只是因为item(0)返回的实际类型恰好是Element。
小灰狼 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

父类是不可以转子类的,这就是面向对象的思想,你比如父类是轿车 而子类是保时捷 那么子类保时捷的对象一定是轿车所以子类可以赋值给父类 但是轿车对象可不一定是保时捷牌的 所以这需要用面向对象的思想去思考就很明白了
[/Quote]

不好意思,你的理解不太准确,不过你的例子倒是合理
1、子类转到父类是自动的,必然的,因为“保时捷”一定是“轿车”,这不用怀疑

2、父类向子类转型,是可能的,因为一辆“轿车”有可能是“保存时捷”,也有可能“丰田”。所以,父类赋值给子类时要作强制类型转换,并且java还提供了instanceof操作,用于判断子类对象是否是父类的类型。父类转型为子类类型时,编译时会通过,但是运行时可能会失败,比如你想把一辆“轿车”转型为“丰田”时,可能会失败,因为它是“保时捷”。

3、父类向子类、子类向父类转型这种上下级之间的转型都存在可能性,但是“兄弟”类之间的平级转型是不合理的,比如把“地铁”转型成“保时捷”,“西瓜”转型成“轿车”肯定是不合理的,这种情况下,在编译期间就已经通不过了。
ltelink 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 6 楼 的回复:

Java code
Fu f = new Zi();
Zi z =(Zi)Fu();


要强转的话应该是这样的

Fu f = new Zi();
Zi z = (Zi)f;
应该这样写吧?
[/Quote]

这样写应该是对的啊。
金墨痴 2012-07-19
  • 打赏
  • 举报
回复
转错了
我为JAVA狂 2012-07-19
  • 打赏
  • 举报
回复
(Zi)Fu() 这种写法不对。你要转换的是对象类型,要么是(Zi)new Fu() 要么是(Zi)f
这样是强制将父类转化为子类
加载更多回复(2)

62,628

社区成员

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

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