在转换为接口时出现Flex“Type Coercion”错误

时间:2009-07-15 23:26:57

标签: flex interface module

这是我在 handleModuleReady 函数中遇到的错误:

[Fault] exception, information=TypeError: Error #1034: Type Coercion failed: 
can not convert MyModule@39b8479 to IModuleInterface.

我有一个应用程序设置,我已经创建了在运行时加载的模块,以减少文件大小(因为大多数用户只需要其中一个模块)。

<!-- maker.mxml -->
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
  xmlns="*"
  layout="absolute" 
  creationComplete="init(event)">
<mx:Style source="css/maker.css" />
<mx:Script>
<![CDATA[
    //Modules
    import mx.events.ModuleEvent;
    import mx.modules.ModuleLoader;
    import mx.modules.ModuleManager;
    import mx.modules.IModuleInfo;

    private var info:IModuleInfo;

    ...
    private function init(e:Event):void {
        info = ModuleManager.getModule("MyModule.swf");
        info.addEventListener("ready", handleModuleReady);
        info.addEventListener("error", handleModuleError);
        info.load(ApplicationDomain.currentDomain);
    }

    private function handleModuleReady(moduleEvent:ModuleEvent):void {
        var ichild:IModuleInterface = IModuleInterface(moduleEvent.target.factory.create());
        if (ichild != null) {
          //call class functions here via ichild object
        }
        else {
          trace("Something has gone wrong.");
        }
    }
...
</mx:Script>
...

我创建了IModuleInterface类(IModuleInterface.as),并且MyModule.mxml文件编译没有问题,但我继续得到类型转换错误,尽管尝试了各种可能的解决方案,例如通过ModuleLoader,ModuleManager加载模块,最近设置了applicationDomain。

请告诉我你是否知道如何解决这个问题。互联网的其余部分没有。相信我,我看了。

如果相关,界面看起来像这样。

//IModuleInterface.as
package
  {
    public interface IModuleInterface {
    function getSomeClass():Class;
    function getSomeArray():Array;
    function getSomeInt():int;
  }
}

2 个答案:

答案 0 :(得分:1)

首先,如果您想将ichild与null进行比较,则应使用as进行投射:

var ichild:IModuleInterface = moduleEvent.target.factory.create() as IModuleInterface;

其次,你能否确认create()是返回模块的一个实例(而不是包装它的东西)?从错误的外观来看,它是。

假设它是,您的无包装接口可能是问题。将它放入一个包中,并确保主应用程序和模块都引用相同的接口接口。

让我知道这是怎么回事。

答案 1 :(得分:0)

我读错了这个问题

试试这个:

var module :IModuleInterface = evt.module.factory.create() as IModuleInterface;