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))
这次没有错误,但是错误的方法被称为……
我该如何解决这个问题?
您可以修复cannot convert instance of class org.jruby.RubyModule to class java.lang.Class
使用java.lang.Class.for_name
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")] #
我之前遇到过这样的问题。 这是很多版本以前我认为JRuby的方法匹配算法随着时间的推移已经有所改进。 你在使用最新的JRuby吗?
如果没有其他工作,您可能需要添加另一个方法或包装类。 通过名称或参数数量区分您的方法的东西,而不仅仅是参数类型。