【问题标题】:Flex "Type Coercion" error when casting to interface强制转换到界面时出现 Flex“类型强制”错误
【发布时间】:2010-11-11 04:51:17
【问题描述】:

这是我在 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;
  }
}

【问题讨论】:

  • 愚蠢的问题,但我认为 MyModule 正确实现了“IModuleInterface”?
  • 它在 标签中“实现了 IModuleInterface”。是否需要做一些额外的事情才能正确?

标签: apache-flex interface module


【解决方案1】:

我把问题读错了

试试这个:

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

【讨论】:

  • 如果在父应用域中定义了接口,则可以将子域中的实现类强制转换为该接口。仅当创建了新的应用程序域(不是子域)时,这是不可能的。
  • 是的,你是对的,我读错了问题,这是一个选角问题。
【解决方案2】:

首先,如果要将 ichild 与 null 进行比较,则应使用 as 进行强制转换:

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

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

假设是,您的无包接口可能是问题所在。将其打包,并确保主应用程序和模块引用相同的接口接口。

让我知道这是怎么回事。

【讨论】:

  • 非常感谢!将接口移动到一个包中,更新模块和应用程序代码以反映这一点,然后重新编译就可以了。
猜你喜欢
  • 1970-01-01
  • 2017-07-19
  • 2018-04-24
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 2021-01-24
  • 2023-03-17
  • 2012-08-07
相关资源
最近更新 更多