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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴亨 黑马帝   /  2011-12-20 15:05  /  2037 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        public void windowClosing(WindowEvent e) {
       
               (Window)(e.getComponent()).dispose();
                (Window)(e.getSource()).dispose();
        }
这样的强制转换为什么不行?

4 个回复

倒序浏览
e.getComponent()返回的是Component类类型,是Window类的父类,但是Component下面子类有很多,相当于,动物是父类,猫是子类,猫可以讲是动物,但你不能讲动物就只是猫。父类强转会子类,需要先由父类对象指向子类实例,也就是只有用子类实例初始化的父类对象才能向下强转为对应的子类类型。

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
我要说明的一点是:强制转换不是万能的。
我先帮你分析一下:dispose()方法是window类的成员方法,window类继承了Container类,并实现了Accessible接口。Container类继承了component类。简单一点说就是:component类是Container类的爸爸,window类是Container的儿子。dispose()是儿子的方法。由于继承关系的存在,window既有自己的特有方法,也有从Container,component继承过来的方法。儿子有的东西,爸爸不一定有,爸爸有的东西儿子一定有。这就是继承。
再看你自己的写这个例子:(Window)(e.getComponent()).dispose();
e.getComponent()返回的是一个component对象,然后在调用component的dispose方法。把这个dispose方法强制转换成一个window类,你感觉可以吗?方法能强制转成类吗?
你这样写的目的是将e.getComponent返回的component对象转成window对象然后再调用dispose方法!
1,想法不可行,子类对象不能强制转换成父类对象。window类中没有dispose()方法。
2,写法也是错的,要明白算数运算符的优先级和执行顺序问题。这种写法不会先转类型在取对象。

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
吴亨 黑马帝 2011-12-21 22:55:27
板凳
谢了兄弟。
回复 使用道具 举报
首先 : dispose()方法是没有返回类型的,你不能对它进行类型装换。
类型转换有两种情况 :一种是兼容的类型装换(Java 的自动转换),如数字类型,包括整数(integer )和浮点(floating-point )类型都是彼此兼容的,但是,数字类型和字符类型(char)或布尔类型(bollean )是不兼容的。字符类型(char )和布尔类型(bollean )也是互相不兼容的。另一中是不兼容的类型转换,它的通用格式如下:(target-type)value ,它往往伴随着精度的丢失,如将一个int 型强制转换成byte 型。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

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