Я пытаюсь перейти от использования флага компилятора -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 действительно правильный способ решить эту проблему.
@JsOverlay
помочь? 26.01.2017