Tre*_*kaz 10 java overloading rhino
参加以下测试:
public static class Scripted {
public void setThing(List<?> list) {
System.out.println("Set via list");
}
public void setThing(Object[] array) {
System.out.println("Set array");
}
}
@Test
public void testScripting() throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
engine.getContext().setAttribute("s", new Scripted(), ScriptContext.ENGINE_SCOPE);
engine.eval("s.thing = Array(1, 2, 3);");
}
Run Code Online (Sandbox Code Playgroud)
随着使用Java 7的Rhino版本运行,如果你运行它,你将得到如下的异常:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: The choice of Java constructor setThing matching JavaScript argument types (object) is ambiguous; candidate constructors are:
void setThing(java.util.List)
void setThing(java.lang.Object[]) (<Unknown source>#1) in <Unknown source> at line number 1
Run Code Online (Sandbox Code Playgroud)
该Object[]摆在首位超载存在是因为犀牛的先前版本不会自动转换数组List,但将它们转换Object[].
如果这是个人项目,那么我就是删除Object[]过载的地方.问题是这是一个公共API,现在可能有人调用该方法.我仍然想升级到Java 7,但我想避免让JavaScript用户或使用该方法的数组版本的人感到不安.
有没有办法隐藏Object[]Rhino 的重载方法,而其他方法仍然可以调用它们?
Han*_*fer 10
虽然它不是很优雅,但有一种方法可以专门调用一个重载的Java方法.它在Java方法重载和LiveConnect 3规范的最后一节中定义.基本上,您使用要调用的方法的整个签名,因为它显示在错误消息中,使用方括号表示法.在您的情况下,以下应该工作:
s["setThing(java.util.List)"](Array(1, 2, 3));
Run Code Online (Sandbox Code Playgroud)
我们用实现java.util.List的JavaScript数组所做的更改打破了现有代码,这有点不幸.也许最好只选择一个,以防有多种匹配方法.
| 归档时间: |
|
| 查看次数: |
2365 次 |
| 最近记录: |