关于ActionScript3中的事件类强制转换失败的问题
2012-08-13 22:31
225 查看
错误提示:
写这个主要是为了遇到这个错误的人能迅速的解决这个问题,如果我下面说的两种情况你都知道,那么你就不用看了,
否则,你最好往下看看,没坏处的。因为如果你的错误是第二种情况引起的,但你又不知道为什么,我想还是会让人很郁闷的。
一般产生错误的两种情况:
1、抛出的事件和监听事件的回调方法参数类型不一样(如果抛出的是子类,方法的参数类型是父类是可以的)
2、另外一种情况可能是你转发了一个没有重载clone的自定义事件。
下面主要说说第二种情况产生的错误,下面两段代码是我写的测试程序。
事件类源码:
主程序Application源码:
如果运行上面的代码,就会出现刚才说的异常,那是因为在onTestEvent重新派发evnet(MyEvent类型)时,
flash内部的事件框架将会自动调用事件的clone方法来生成这个事件的一个新实例,
如果没有重载clone方法,也就是说使用的是默认的重载方法(Event类的clone方法),
那么新的事件实例就是一个普通的Event类型的事件,而不是自定义事件。
那么当事件(Event类型)被抛出时,onTestEvent2(event:MyEvent)的参数却是MyEvent类型的。
所以你就不会奇怪为什么会抛出这个异常了。
知道为什么了,那么解决这个问题的方法就很清楚了,在MyEvent类中新增加一个方法,即重载Event的clone方法
说了一大推,其实结果很简单,写自定义事件的时候最好重载clone方法,因为你不知道你的事件会不会像我的这段代码这样被抛来抛去。
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方法,因为你不知道你的事件会不会像我的这段代码这样被抛来抛去。
相关文章推荐
- 关于ActionScript3中的事件类强制转换失败的问题
- 关于子类父类对象强制转换问题
- 关于类型P和N的数据强制转换为C型问题
- flex 装载多个module出现的问题Error #1034: 强制转换类型失败
- 关于IList类型与IList<T>在运行时类型转换失败的问题
- java关于字符串转换数组的问题,ss.split(".")转换失败
- 关于OpenOffice转换失败,源文件无法删除问题的解决办法
- 关于EXP-00056: 遇到 ORACLE 错误 1455 ORA-01455: 转换列溢出整数数据类型 EXP-00000: 导出终止失败 的问题解决方法整理
- 关于Blend4 无法新建 windows phone OS7.1 的问题,强制用VS转换7.1出现资源文件不存在。
- 关于sql条件语句where id in (@参数)执行报错问题(转换成数据类型 int 时失败)(
- 关于微信全网发布升级php7后出现返回事件消息失败和返回文本消息失败问题public function __construct
- 关于java中任意对象强制转换为接口类型的问题
- 关于MVC中无法将类型为“System.Int32”的对象强制转换为类型“System.String”的问题。
- 关于多继承,dynamic_cast转换失败的问题
- 关于“LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”问题的探讨
- 关于子类父类对象强制转换问题
- 关于FAT32转换成NTFS失败问题
- cocos关于pageview嵌套listview,事件响应问题
- vs2010 问题 >LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏