为什么可以';JRuby在重载时是否使用参数为RubyArray的Java方法?
使用重载方法创建Java类:为什么可以';JRuby在重载时是否使用参数为RubyArray的Java方法?,java,ruby,jruby,Java,Ruby,Jruby,使用重载方法创建Java类: public void test(float x) { } public void test(RubyArray array) { } 红宝石色 object.test(1.0) 很好。然而: object.test([1.0,2.0]) 将因以下消息而崩溃: org.jruby.exceptions.RaiseException: (NameError) no method 'test' for arguments (org.jruby.RubyArr
public void test(float x) {
}
public void test(RubyArray array) {
}
红宝石色
object.test(1.0)
很好。然而:
object.test([1.0,2.0])
将因以下消息而崩溃:
org.jruby.exceptions.RaiseException: (NameError) no method 'test' for arguments (org.jruby.RubyArray) on Java::MyNamespace::MyClass
available overloads:
(org.jruby.RubyArray)
(int)
但是,正如你所看到的,这没有任何意义。它告诉我我的RubyArray
类型的参数没有方法,然后它立即告诉我RubyArray
类型的参数有一个可用的重载
有趣的是,如果您删除(int)
重载,那么它就可以正常工作,也就是说,如果接受RubyArray
的方法没有其他重载,那么它就可以正常工作
我以前创建过许多重载Java方法,并在Ruby中使用过它们,所以我猜问题主要与RubyArray
参数本身有关——尽管我没有看到问题所在
为什么呢?我做错了什么
我正在使用
jruby1.7.11
,为我认为的Eclipse Kepler for Mac上的JavaSE6
构建
为了便于测试,您可以运行以下两个程序: 这是有效的:
import javax.script.*;
import org.jruby.RubyArray;
public class Main {
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
Main app = new Main();
}
public Main() throws ScriptException, NoSuchMethodException {
ScriptEngine jruby = new ScriptEngineManager().getEngineByName("jruby");
jruby.eval("include Java;\n" + "def start(main) main.test([1,2,3]); end");
Invocable invocable = (Invocable)jruby;
invocable.invokeFunction("start",this);
}
public void test(RubyArray array) {
System.out.println(array);
}
}
import javax.script.*;
import org.jruby.RubyArray;
public class Main {
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
Main app = new Main();
}
public Main() throws ScriptException, NoSuchMethodException {
ScriptEngine jruby = new ScriptEngineManager().getEngineByName("jruby");
jruby.eval("include Java;\n" + "def start(main) main.test([1,2,3]); end");
Invocable invocable = (Invocable)jruby;
invocable.invokeFunction("start",this);
}
public void test(int x) {
System.out.println(x);
}
public void test(RubyArray array) {
System.out.println(array);
}
}
这不起作用:
import javax.script.*;
import org.jruby.RubyArray;
public class Main {
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
Main app = new Main();
}
public Main() throws ScriptException, NoSuchMethodException {
ScriptEngine jruby = new ScriptEngineManager().getEngineByName("jruby");
jruby.eval("include Java;\n" + "def start(main) main.test([1,2,3]); end");
Invocable invocable = (Invocable)jruby;
invocable.invokeFunction("start",this);
}
public void test(RubyArray array) {
System.out.println(array);
}
}
import javax.script.*;
import org.jruby.RubyArray;
public class Main {
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
Main app = new Main();
}
public Main() throws ScriptException, NoSuchMethodException {
ScriptEngine jruby = new ScriptEngineManager().getEngineByName("jruby");
jruby.eval("include Java;\n" + "def start(main) main.test([1,2,3]); end");
Invocable invocable = (Invocable)jruby;
invocable.invokeFunction("start",this);
}
public void test(int x) {
System.out.println(x);
}
public void test(RubyArray array) {
System.out.println(array);
}
}
我认为这是因为在Ruby中,由于没有数据类型声明,所以不能重载具有相同数量参数的方法。您只能重载具有不同数量参数的方法:
public void test(int x)
vspublic void test(RubyArray arr,int x)
因此,当您调用测试方法时,它会跳转,只使用第一个方法(不知道它如何或为什么搜索或找到具有int参数的方法)
另请参见此答案:您可以使用java_send(方法名称符号),(类型数组),*参数指定类型,例如:
object.java_send :test, [RubyArray], [1.0,2.0]
对于不发送数组的多个参数,顺便说一句,它看起来像以下示例:
@是的,问题一定是RubyArray。但是我想知道为什么。我以前的编辑没有被包括在内,因此有一个新的注释:这将与
java.util.List
参数一起工作。。。我个人认为这是解析逻辑中的一个缺陷,我会在…上报告这一点(作为特性请求)。。。如果您想知道为什么需要深入了解源代码中的Java支持部分