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),所以可以向下转型,
是不是这样的?

解决方案 »

  1.   

    不是这样的那是因为e.getSource后的对象肯定都是继承或实现Window的对象,所以直接强转,然道理一般在向下转型的时候需要instenceof来容错,判断下但是既然我已经知道e.getSource返回的对象就是继承或实现Window的对象了所以我可以大胆的 直接强制转换
      

  2.   

    个人浅见: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类的对象,向下转肯定没问题的。
      

  3.   

    (即instenceof Window),所以可以向下转型,
    是不是这样的?不是这样的。
      

  4.   

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