[英]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.