Java 我可以强制消除Rhino调用的重载方法的歧义吗?

Java 我可以强制消除Rhino调用的重载方法的歧义吗?,java,overloading,rhino,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 te

进行以下测试:

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);");
}
编写脚本的公共静态类{
公共无效设置(列表){
System.out.println(“通过列表设置”);
}
公共无效设置(对象[]数组){
System.out.println(“设置数组”);
}
}
@试验
public void testScripting()引发异常{
ScriptEngine=new ScriptEngineManager().GetEngineeByExtension(“js”);
engine.getContext().setAttribute(“s”,新脚本化(),ScriptContext.engine_范围);
eval(“s.thing=Array(1,2,3);”;
}
对于带有Java 7的Rhino shipping版本,如果您运行此命令,将出现如下异常:

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
javax.script.ScriptException:sun.org.mozilla.javascript.internal.EvaluatorException:与javascript参数类型(对象)匹配的Java构造函数设置的选择不明确;候选建造商包括:
void设置(java.util.List)
第1行中的void sething(java.lang.Object[])(#1)
对象[]
重载的存在首先是因为以前版本的Rhino不会自动将数组转换为
列表
,但它会将数组转换为
对象[]

如果这是一个个人项目,我会删除
对象[]
重载。问题是这是一个公共API,可能有人正在调用该方法。我仍然希望升级到Java7,但我希望避免让JavaScript用户或使用该方法的数组版本的人感到不安


有没有一种方法可以对Rhino隐藏
对象[]
重载的方法,而其他人仍然可以调用它们?

尽管它不是很优雅,但有一种方法可以专门调用一个重载的Java方法。它是在规范的最后一节中定义的。基本上,您使用的是要调用的方法的整个签名,因为它显示在错误消息中,使用方括号表示法。在您的情况下,以下各项应起作用:

s["setThing(java.util.List)"](Array(1, 2, 3));

不幸的是,我们对实现java.util.List的JavaScript数组所做的更改破坏了现有代码。如果有多个匹配方法,最好只选择一个。

这是针对重载构造函数()的:


我同意。。。如果它只调用列表一而不这样失败,那会更好。但是Java7破坏了我们应用程序中的许多其他功能,这只是众多功能之一(其他功能,如区域设置更改,都已解决)
new java.lang.String["(char[])"](c)