import java.awt.*;
import java.awt.event.*;
public class TestStopWatch  extends Frame{
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
TestStopWatch tsw = new TestStopWatch();
tsw.setSize(1000, 800);
tsw.setVisible(true);
tsw.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
e.getWindow().setVisible(false);
((Window)e.getSource()).dispose(); //这行.
}
});
}
}这是我的疑问,我觉得不能进行向下转型,请问我的问题在哪里?问题补充: 
我想问的是,
怎么可以那么随意的向下转型,不会危险吗?

解决方案 »

  1.   

    ((Window)e.getSource()).dispose()
    这句代码会先执行e.getSource.返回的是Object类型,Object类型是一起引用类型的父类
    自然可以强制转换.
    你试着((Window)e).getSource.dispose就会发现不能强制转换了.这种转换要满足一个条件
    必须存在这种父子关系才能强制转换,为了避免这种情况,我们一般用instance of来判断,
    if(s1 instanceof s2){
      执行业务代码
    }写了这么多,给点分吧》。
      

  2.   

    向下转型不是编译期能发现的,而必须等到运行期。
    因此就如楼上说的用instanceof判断一下。
      

  3.   

    子类可以任意的转到其父类或者实现了的接口。而且,强制转型,特别是当前类不明确时,比如Object, 只能在运行期间判断了。
      

  4.   

    因为触发窗口关闭事件的源必然是一个Window对象,所以这里没有问题。