有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaJRuby调用了错误的方法

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

在我的Java类中,这些方法定义了两次,而JRuby似乎调用了错误的方法

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

TypeError: cannot convert instance of class org.jruby.RubyModule to class 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) 个答案

  1. # 1 楼答案

    我以前也遇到过这样的问题。这是许多版本以前的版本,我认为JRuby的方法匹配算法随着时间的推移已经有所改进。您正在使用最新的JRuby吗

    如果其他方法无效,则可能需要添加另一个方法或包装器类。通过名称或参数数量而不仅仅是参数类型来区分方法的东西

  2. # 2 楼答案

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

    在你的情况下,是这样的

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

    这是因为java接口在默认情况下成为Ruby模块,java方法的第二个参数需要一个类对象数组

    您可以打印匹配的方法,以查看它是否与预期的方法匹配。 例如,我看到下面的代码与系统上的println(字符串)匹配。出去

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