GWT JsInterop迁移

时间:2016-09-16 08:43:00

标签: javascript gwt

我正在尝试使用编译器标志-XjsInteropMode JS进行迁移,但我遇到了一个问题。

我有一个名为Module的界面,如下所示:

@JsType
public interface Module {
    @JsProperty
    String getBasename();   
}

然后我有另一个名为AuthenticationModule的界面,如下所示:

@JsType
public interface AuthenticationModule extends Module {
    static final String MODULE_NAME = "authentication";

    void logIn(String username, String password, JsConsumer<JavaScriptObject> onSuccess, JsConsumer<JavaScriptObject> onError);

    void logOut(JsConsumer<JavaScriptObject> onSuccess, JsConsumer<JavaScriptObject> onError);
}

模块接口只是一个标记接口,所以当我加载某个模块时,我能够将它最终转换为我想要的模块,例如:

@Override
    public void getAuthenticationModule(
            OnModuleLoaded<AuthenticationModule> onModuleLoaded) {
        initializeIfNecessary();
        JsArrayString requiredModules = JavaScriptObject.createArray().cast();
        requiredModules.push(AuthenticationModule.MODULE_NAME);
        modules.require(requiredModules, loadedModule -> {
            onModuleLoaded.moduleLoaded((AuthenticationModule) loadedModule); // this line (the casting) throws ClassCastException
        });
    }
此代码中的

modules是另一个界面,如下所示:

@JsType
public interface Modules {
    @JsFunction
    @FunctionalInterface
    interface CallbackRequire {
        void apply(Module module);
    }

    @JsProperty
    String getBase();

    @JsProperty
    void setBase(String base);

    void require(JsArrayString modules, CallbackRequire onload);
}

我在本文档中遵循了有关如何迁移的规则: https://docs.google.com/document/d/10fmlEYIHcyead_4R1S5wKGs1t2I7Fnp_PaNaa7XTEk0/edit#

我无法解决这个问题。我能得到的最好的就是将@JsType更改为@JsType(isNative = true)。然后投射工作,但发生了另一个错误,现在不记得了,但我不确定isNative是否真的是解决这个问题的正确方法。

1 个答案:

答案 0 :(得分:0)

在大多数接口上添加“(isNative = true)”之后,它再次起作用。我唯一需要更改的是MODULE_NAME字段,因为它们无法在本机JsType中初始化。