簡體   English   中英

為什么JRuby在重載時不能使用參數為RubyArray的Java方法?

[英]Why can't JRuby use my Java method whose parameter is a RubyArray when it is overloaded?

有一個帶有重載方法的Java類:

public void test(float x) {

}

public void test(RubyArray array) {

}

在Ruby中,

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參數本身有關 - 盡管我沒有看到這個問題。

這是為什么? 我在這做錯了什么?


我正在使用JRuby 1.7.11 ,我認為Eclipse Kepler for Mac上的Java SE 6正在構建。


為了便於測試,您可以運行以下兩個程序:

這有效:

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)

因此,當你調用test-method時,它會翻轉,它只需要第一種方法(不知道它是如何或為什么搜索或找到帶有int-param的方法)。

另請參閱此答案: 為什么ruby不支持方法重載?

您可以使用java_send(方法名稱符號),(類型數組),* args指定類型,例如:

object.java_send :test, [RubyArray], [1.0,2.0]

對於不發送數組的多個args,順便說一句,它看起來像CallingJavaFromJRuby中的這個例子:

list.java_send :add, [Java::int, java.lang.Object], 0, 'foo'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM