Выполните следующий тест:
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);");
}
В версии Rhino, поставляемой с Java 7, если вы запустите это, вы получите такое исключение:
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
Перегрузка Object []
в первую очередь связана с тем, что предыдущая версия Rhino не преобразовывала массивы автоматически в List
, но преобразовывала их в Объект []
.
Если бы это был личный проект, я бы просто удалил перегрузку Object []
. Проблема в том, что это общедоступный API, и прямо сейчас кто-то может вызвать этот метод. Я все еще хотел бы перейти на Java 7, но я бы не хотел расстраивать пользователей JavaScript или людей, использующих версию метода с массивом.
Есть ли способ скрыть перегруженные методы Object []
от Rhino, пока другие смогут их вызывать?