JRuby调用了错误的方法

时间:2011-06-04 18:54:22

标签: java jruby

我从JRuby调用Java方法时遇到了一个奇怪的问题。

在我的Java类中,这些方法定义了两次,看来JRuby调用了错误的方法。

所以我尝试使用java_method,但我总是得到:

  

TypeError:无法将类org.jruby.RubyModule的实例转换为类java.lang.Class

这是我的Java代码:

public class Renderer {

    ...
    public void addRenderer(IElementRenderer r) {
        System.out.println("Added element render: " + r.getClass().toString());

        basicRenderers.add(r);
        rendererMap.put(r.elementClass(), r);
    }

    public void addRenderer(IBasicRenderer r) {
        System.out.println("SHOULD NOT GO THERE !!");
        basicRenderers.add(r);
    }
}

和我的JRuby代码:

add_renderer = renderer.java_method :add_renderer, [Java::dragon.render.IElementRenderer]
add_renderer.call TextRenderer.new

我也试过了java_send,但我得到了同样的错误:

  

renderer.java_send(:add_renderer,[Java :: dragon.render.IElementRenderer],TextRenderer.new)

接下来,我尝试了:

  

renderer.add_renderer(TextRenderer.new.to_java(IElementRenderer))

这次没有错误,但是错误的方法被称为......

如何解决此问题?

2 个答案:

答案 0 :(得分:4)

您可以使用cannot convert instance of class org.jruby.RubyModule to class java.lang.Class

修复java.lang.Class.for_name

在你的情况下,它是

add_renderer = renderer.java_method :add_renderer, [java.lang.Class.for_name("dragon.render.IElementRenderer")]

这是因为java接口默认为Ruby Modules,第二个参数为:java_method需要一个Class对象数组。

您可以打印匹配的方法,看它是否与预期的方法相匹配。 例如,我看到下面的代码与System.out上的println(String)相匹配。

>>java.lang.System.out.java_method "println", [java.lang.Class.for_name("java.lang.String")]
#<Method: Java::JavaIo::PrintStream#(java.lang.String)>

答案 1 :(得分:0)

我之前遇到过这样的问题。这是很多版本以前我认为JRuby的方法匹配算法随着时间的推移而得到改善。你使用的是最新的JRuby吗?

如果没有其他工作,您可能需要添加另一个方法或包装类。通过名称或参数数量区分您的方法的东西,而不仅仅是参数类型。