请参加以下测试:
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);");
}
在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
首先,首选使用List
而不是Object[]
的原因是,Rhino的早期版本不会自动将数组转换为List
,但它会将它们转换为Object[]
。
如果这是一个个人项目,我会删除Object[]
重载。问题是这是一个公共API,可能有人正在调用该方法。虽然我仍想升级到Java 7,但我希望避免打扰JavaScript用户或使用方法的数组版本的人。
是否有一种方法可以隐藏Rhino中的Object[]
重载方法,同时其他人仍然能够调用它们?