2009-05-20 72 views
3

我刚刚尝试弯曲,最近碰到了一个绊脚石铸件。Flex 3.2铸造问题

这是我正在运行的代码。

/** 
* 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发生。如果我使用'as'关键字,我得到的colourItem投结果是空以下错误抛出

TypeError: Error #1034: Type Coercion failed: cannot convert com.mystuff::[email protected] to com.mystuff.CSBackgroundItem. 

。使用调试器显示该列表不是空的,并确实填充了CSBackgroundItem对象。

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

任何人都可以阐明为什么会发生这种情况?

+0

使用ObjectUtil.copy()与'as'关键字具有相同的结果,'colourItem'对象保留为空而不是异常。 – Scrimmers 2009-05-20 07:58:11

回答

1

FYI,一个加载到一个孩子ApplicationDomain的类型可以被转换为一个类型(它扩展/实现)在父ApplicationDomain中。

例如,

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

很酷,在这种情况下,没有扩展的继承,但很好知道 – Scrimmers 2009-05-20 11:02:38

1

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

我的猜测是模块加载在不同的ApplicationDomain ..这将意味着你不能在当前域来自同一类型转换..

据我所知,这隐约地类似于加载相同类的不同Java ClassLoaders。

一旦我证实,它

1

是啊..这工作我会后再次..

这里是我的MXML样式中使用的修复..

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

的equivilant动作将

loader.applicationDomain = ApplicationDomain.currentDomain;