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