Flex 3.2铸造问题

时间:2009-05-20 07:53:54

标签: flex actionscript-3 casting

我很擅长弯曲,最近遇到了障碍。

这是我正在运行的代码。

/**
* return background definition depending on time
*/ 
private function findBackgroundItem( relativeTime : Number ) : CSBackgroundItem
{
    if( this.backgroundItems == null ) return null;
    var result :CSBackgroundItem = null;
    var relative:Date = new Date(relativeTime);
    for( var i : Number = 0; i < this.backgroundItems.length; i++ )
    {
        // backgroundItems is an Ilist of CSBackgroundItem.
        var colourItem : CSBackgroundItem = CSBackgroundItem( this.backgroundItems.getItemAt( i ) );

        // other stuff here
    }           
    return result;
}

当IList.getItemsAt()结果强制转换为CSBackgroundItem变量colourItem时,会出现问题。抛出以下错误

TypeError: Error #1034: Type Coercion failed: cannot convert com.mystuff::CSBackgroundItem@650e8dd1 to com.mystuff.CSBackgroundItem.

如果我使用'as'关键字,我会在colourItem为空的情况下获得投射结果。使用调试器显示列表不为空,并且确实填充了CSBackgroundItem个对象。

现在这是古怪的一点..这段代码有效,第一次加载模块..后续加载(卸载后)抛出异常。

任何人都可以解释为什么会发生这种情况吗?

3 个答案:

答案 0 :(得分:1)

我想我可能找到了答案..

我的猜测是模块正在加载一个不同的ApplicationDomain ..这意味着你不能在当前域中使用相同的类型进行转换..

据我所知,这与加载同一类的不同Java ClassLoader模糊相似。

我确认后会再次发帖

答案 1 :(得分:1)

是的......有效..

这是MXML样式中使用的修复程序..

<mx:ModuleLoader id="loader" x="10" y="10" width="100%" height="100%" applicationDomain="{ApplicationDomain.currentDomain}"/>

等效的动作脚本将是

loader.applicationDomain = ApplicationDomain.currentDomain;

答案 2 :(得分:1)

仅供参考,加载到子ApplicationDomain中的类型可以强制转换为父ApplicationDomain中的类型(它扩展/实现)。

例如

loader.applicationDomain = ApplicationDomain.currentDomain; // parent domain
loader.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); // child domain
loader.applicationDomain = new ApplicationDomain(); // new domain