Могу ли я принудительно устранить неоднозначность перегруженных методов, вызываемых 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);");
}

В версии 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, пока другие смогут их вызывать?

10
задан Trejkaz 21 November 2011 в 06:11
поделиться