关于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方法,因为你不知道你的事件会不会像我的这段代码这样被抛来抛去。

你可能感兴趣的:(actionscript)