java – 我可以强制消除犀牛所称重载的方法吗?
发布时间:2020-05-27 08:50:22 所属栏目:Java 来源:互联网
导读:进行以下测试: public static class Scripted { public void setThing(List? list) { System.out.println(Set via list); } public void setThing(Object[] array) { System.out.println
|
进行以下测试: 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用户或使用阵列版本的方法的人感到烦恼. 有没有办法隐藏来自Rhino的Object []重载方法,而其他方法仍然可以调用它们? 解决方法虽然它不是很优雅,但是有一种专门调用一个重载Java方法的方法.它在 Java Method Overloading and LiveConnect 3规范的最后一节中定义.基本上,您使用方括号的整个签名,使用方括号符号显示在错误消息中.在您的情况下,以下应该工作:s["setThing(java.util.List)"](Array(1,3)); 不幸的是,我们使用实现java.util.List的JavaScript数组进行的更改会破坏现有的代码.也许最好选择一个,以防万一有多种匹配的方法. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 使用Cassandra和CQL3,如何在单个请求中插入整个宽行?
- Java实现的图片高质量缩放类定义与用法示例
- 如何使用java8 lambda表达式抛出自定义检查的异常?
- java – 泽西:InjectableProvider没有拿起 – 春天
- Java中是否存在零时间启动(无重新编译)可切换条件标志?
- java – 查找数组中的数字总和 – 不包括数字13和它后面的数
- JAVA字符串格式化-String.format()的使用
- java – 在ComboBox中为FilteredList设置谓词会影响输入
- 在Shutdownhook上使用JavaFX Application.stop()方法
- IntelliJ Idea 2017注册码免费激活方法
