关于ActionScript3中的事件类强制转换失败的问题

错误提示:

TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::Event@6169971 转换为 xxxxx。


 写这个主要是为了遇到这个错误的人能迅速的解决这个问题,如果我下面说的两种情况你都知道,那么你就不用看了,
否则,你最好往下看看,没坏处的。因为如果你的错误是第二种情况引起的,但你又不知道为什么,我想还是会让人很郁闷的。

一般产生错误的两种情况:
1、抛出的事件和监听事件的回调方法参数类型不一样(如果抛出的是子类,方法的参数类型是父类是可以的)
2、另外一种情况可能是你转发了一个没有重载clone的自定义事件。

下面主要说说第二种情况产生的错误,下面两段代码是我写的测试程序。

 

事件类源码: 

 

package
{
    import flash.events.Event;
    
    public class MyEvent extends Event
    {
        public static const TEST_EVENT:String 
= "TestEvent";
        
        private 
var _myData:String;
        public 
function MyEvent(type:String, data:String, bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);
            
            _myData 
= data;
        }
        
        public 
function get myData():String
        {
            
return _myData;
        }
    }
}


主程序Application源码: 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" minWidth="955" minHeight="600"
                creationComplete
="initApp();">
    
<mx:Script>
        
<![CDATA[
            private function initApp():void
            {
                this.addEventListener(MyEvent.TEST_EVENT,onTestEvent);
            }
            
            protected function button1_clickHandler(event:MouseEvent):void
            {
                this.dispatchEvent(new MyEvent(MyEvent.TEST_EVENT,"1901"));
            }

            private function onTestEvent(event:MyEvent):void
            {
                this.removeEventListener(MyEvent.TEST_EVENT,onTestEvent);
                this.addEventListener(MyEvent.TEST_EVENT,onTestEvent2);
                
                trace("onTestEvent: " + event.myData);
                this.dispatchEvent(event);
            }
            
            private function onTestEvent2(event:MyEvent):void
            {
                trace("onTestEvent2: " + event.myData);
            }

        
]]>
    
</mx:Script>
    
    
<mx:Button label="dispatchEvent" click="button1_clickHandler(event)" />
</mx:Application>


 如果运行上面的代码,就会出现刚才说的异常,那是因为在onTestEvent重新派发evnet(MyEvent类型)时,
flash内部的事件框架将会自动调用事件的clone方法来生成这个事件的一个新实例,
如果没有重载clone方法,也就是说使用的是默认的重载方法(Event类的clone方法),
那么新的事件实例就是一个普通的Event类型的事件,而不是自定义事件。
那么当事件(Event类型)被抛出时,onTestEvent2(event:MyEvent)的参数却是MyEvent类型的。
所以你就不会奇怪为什么会抛出这个异常了。

知道为什么了,那么解决这个问题的方法就很清楚了,在MyEvent类中新增加一个方法,即重载Event的clone方法

override public function clone():Event
{
    
return new MyEvent(type,_myData,bubbles,cancelable);
}



说了一大推,其实结果很简单,写自定义事件的时候最好重载clone方法,因为你不知道你的事件会不会像我的这段代码这样被抛来抛去。

posted @ 2010-11-16 17:44  1901  阅读(1089)  评论(0编辑  收藏  举报