为什么可以';JRuby在重载时是否使用参数为RubyArray的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

使用重载方法创建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.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)
vs
public void test(RubyArray arr,int x)

因此,当您调用测试方法时,它会跳转,只使用第一个方法(不知道它如何或为什么搜索或找到具有int参数的方法)


另请参见此答案:

您可以使用java_send(方法名称符号),(类型数组),*参数指定类型,例如:

object.java_send :test, [RubyArray], [1.0,2.0]
对于不发送数组的多个参数,顺便说一句,它看起来像以下示例:


@是的,问题一定是RubyArray。但是我想知道为什么。我以前的编辑没有被包括在内,因此有一个新的注释:这将与
java.util.List
参数一起工作。。。我个人认为这是解析逻辑中的一个缺陷,我会在…上报告这一点(作为特性请求)。。。如果您想知道为什么需要深入了解源代码中的Java支持部分