日期:2014-05-20  浏览次数:20618 次

java,向下转型的疑问!
[code=Java][/code]

Frame f = new Frame(); // new一个Frame对象.
f.setSize(1000, 800); //设置长和宽.
f.setVisible(true); //设置可见性.
f.addWindowListener(new WindowAdapter() { //为窗口注册监听器.
public void windowClosing(WindowEvent e){ //重写 windowClosing方法.
((Window)e.getSource()).dispose(); //疑问 一
((Window)e.getComponent()).dispose(); //疑问二
}
我想问的两个疑问:一:((Window)e.getSource()).dispose();//将Object -> Window
  二:((Window)e.getSource()).dispose();//将Component -> Window
我的疑问是不能随意转成Window(向下转型),
这个问题我曾经疑问了很久,但是刚刚我想,是不是 e 是WindowEven 的,所以返回会自己返回Window的实例
(即instenceof Window),所以可以向下转型,
是不是这样的?


------解决方案--------------------
不是这样的

那是因为e.getSource后的对象肯定都是继承或实现Window的对象,所以直接强转,

然道理一般在向下转型的时候需要instenceof来容错,判断下

但是既然我已经知道e.getSource返回的对象就是继承或实现Window的对象了

所以我可以大胆的 直接强制转换
------解决方案--------------------
个人浅见:

WindowEvent类的getSource()方法,返回一个“最初发生 Event 的对象”,为了统一,都向上转型为Object.
楼主上一贴子,实际上调用这个方法返回的是TestStopWatch 类对象(被向上转型为Object).
而TestStopWatch 类继承关系是:
Object-->Component-->Container-->Window-->Frame-->TestStopWatch
dispose()方法为Window类的方法,本身TestStopWatch 的对象是可以直接用的,但是给向上转型成Object了,所以不向下转是不能用了,(Object无此方法)。所以才要向下转型。

为什么能向下转呢,就是因为有上面的继承关系,虽然是被转成Object,但实际上是 TestStopWatch 对象,所以向下转为Component ,Container, Window, Frame, TestStopWatch 都是没问题的。

楼上这个代码,getSource 应该得到一个Frame类的对象,向下转肯定没问题的。

------解决方案--------------------
要知道转的是引用,不是对象实例,如果实例是window型,引用当时声明成了object型,指向一个window实例
可以将此引用转为所有window的superclass的引用,这也是合乎逻辑的,因为window实例中包含所有superclass的属性