惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
C
Cisco Blogs
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
aimingoo的专栏
aimingoo的专栏
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
Intezer
P
Privacy International News Feed
T
Threatpost
小众软件
小众软件
Latest news
Latest news
T
Threat Research - Cisco Blogs
腾讯CDC
L
LINUX DO - 热门话题
Simon Willison's Weblog
Simon Willison's Weblog
NISL@THU
NISL@THU
Scott Helme
Scott Helme
C
Cyber Attacks, Cyber Crime and Cyber Security
T
The Exploit Database - CXSecurity.com
有赞技术团队
有赞技术团队
T
Tenable Blog
Cisco Talos Blog
Cisco Talos Blog
博客园 - 【当耐特】
Project Zero
Project Zero
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
G
GRAHAM CLULEY
I
InfoQ
V
V2EX
T
Tailwind CSS Blog
IT之家
IT之家
Security Archives - TechRepublic
Security Archives - TechRepublic
Cloudbric
Cloudbric
G
Google Developers Blog
T
Troy Hunt's Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
AI
AI
博客园 - Franky
Martin Fowler
Martin Fowler
罗磊的独立博客
博客园_首页
PCI Perspectives
PCI Perspectives
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
C
Cybersecurity and Infrastructure Security Agency CISA
S
Secure Thoughts
月光博客
月光博客
The Cloudflare Blog
Google Online Security Blog
Google Online Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - 1901

试用Github Pages iOS设备内存及分辨率 测试显示GitHub的Gist 使用GTMBase64编码解码字符串 颜色转换工具 先随便记一下 iOS中获取程序相关的一些目录路径 mac字典词库增加方法 Google的Logo记现代舞先驱玛莎·葛兰姆117周年诞辰-Flash版 关于flash加载flash时的缩放和位置问题 给力壁纸 for mac 【转载】巧用宏定义来简写C,C++代码 Objective-C中的NSObject对象经常使用到的方法 Objective-C属性介绍 应用程序本地化-国家代码介绍(ISO 3166-1) iPhone开发资料 sourceMate2 我在MACOS下常用的软件 【转载】分享一些FLASH开发时用到的工具~
关于ActionScript3中的事件类强制转换失败的问题
1901 · 2010-11-16 · via 博客园 - 1901

错误提示:

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