2009-05-20 4 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() приводится к переменной colourItem CSBackgroundItem. Следующая ошибка возникает

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

Если я использую 'as' ключевое слово, я получаю результаты броска в colourItem быть нулевым. Использование отладчика показывает, что список не пуст и действительно заполнен объектами CSBackgroundItem.

Теперь это дурацкий бит .. этот код работает, первый раз, когда модуль находится в нагрузках .. последующие нагрузки (после выгрузки) вызывают исключение.

Может ли кто-нибудь пролить свет на то, почему это может случиться?

+0

Использование объекта ObjectUtil.copy() имеет тот же результат, что и ключевое слово «как», объект «colourItem» остается нулевым, а не исключением. – Scrimmers

ответ

1

FYI, тип, загружаемый в дочерний объект ApplicationDomain, может быть отнесен к типу (который он extends/реализует) в родительском ApplicationDomain.

Например.

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

ах классный, в этом случае не было наследования расширения, но хорошо знать – Scrimmers

+0

Такая же концепция применима и к самим типам. Дочерний домен приложения будет искать тип в родительском объекте, прежде чем объявлять его сам. В вашем случае вы хотите, чтобы CSBackgroundItem был объявлен в родительском appdomain и только _referenced_ у ребенка. –

+0

Я понимаю, что вы имеете в виду .. нам не нужна «потребность» в объявлении CSBackgroundItem в родительском домене, кроме как для этой цели .. но это будет полезно для некоторых объектов домена – Scrimmers

1

Я думаю, что я, возможно, нашли ответ ..

Моя догадка модуль загружается в другом ApplicationDomain .. что означало бы, что вы не можете отлиты из того же типа в текущем домене ..

Как я понимаю, это смутно аналогично различным Java ClassLoaders, загружающим один и тот же класс.

Я пост еще раз, как только я подтвердил это

1

Угу .. это работает ..

здесь затруднительное я использовал в стиле MXML ..

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

equivilant actionscript будет

loader.applicationDomain = ApplicationDomain.currentDomain; 
Смежные вопросы