JRuby调用了错误的方法 [英] JRuby calls the wrong method

查看:117
本文介绍了JRuby调用了错误的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I got a strange problem with a call to a Java method from JRuby.

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

In my Java class these methods are defined twice, and it appears JRuby calls the wrong one.

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

So I tried to use java_method, but I always got a:


TypeError:无法转换实例class org.jruby.RubyModule to class java.lang.Class

TypeError: cannot convert instance of class org.jruby.RubyModule to class java.lang.Class

这是我的Java代码:

Here's my Java code:

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代码:

and my JRuby code:

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

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

I also tried with java_send but I got the same error:


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

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

接下来,我尝试了:


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

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

这次没有错误,但是调用了错误的方法......

This time no errors but the wrong method is called ...

如何解决此问题?

推荐答案

您可以修复无法使用 java.lang.Class.for_name

在你的情况下,我s

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

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

This is because java interfaces become Ruby Modules by default and the second argument to :java_method expects an array of Class objects.

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

You can print the matched method to see it is matching the intended method. For example, I see below code is matching the println(String) on System.out.

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

这篇关于JRuby调用了错误的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆