我的 Java 中有一个 JSONValue,它可能是 JSONArray、JSONObject、JSONString 等。我想将它传递给可以接受任何这些类型的 JSNI 函数。如果我天真地将我的 JSNI 写成:
public final native jsni(Object parameter) /*-{
doSomething(parameter);
}-*/;
public void useFunction(JSONValue value) {
jsni(value); //Throws js exception at runtime :(
}
然后我得到一个 javascript 异常,因为 GWT 不知道如何将 JSONValue 转换为 JavaScriptObject(或本机字符串/数字值)。
我目前的解决方法是
public final native jsniForJSO(Object parameter) /*-{
doSomething(parameter);
}-*/;
public final native jsniForString(String parameter) /*-{
doSomething(parameter);
}-*/;
public final native jsniForNumber(double parameter) /*-{
doSomething(parameter);
}-*/;
public actuallyUseFunction(JSONValue value) {
if (value.isObject()) {
jsniForJSO(value.isObject().getJavaScriptObject());
} else if (value.isString()) {
jsniForString(value.isString().stringValue());
} else {
//etc
}
}
这对代码可维护性等来说是一个很大的负担……尤其是如果您有多个参数。有没有办法自动生成这些函数,或者完全解决这个问题?我首先将所有内容都包装在 JSONObject 中,所以我绝对可以让 JavaScriptObject 传递给我的 jsni,但这是另一个笨拙的机制。