我正在尝试使用编译器标志-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是否真的是解决这个问题的正确方法。
答案 0 :(得分:0)
在大多数接口上添加“(isNative = true)”之后,它再次起作用。我唯一需要更改的是MODULE_NAME字段,因为它们无法在本机JsType中初始化。