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