您的位置:首页 > 其它

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

2012-08-13 22:31 225 查看
错误提示:

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方法,因为你不知道你的事件会不会像我的这段代码这样被抛来抛去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐