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))
这次没有错误,但是调用了错误的方法
我如何解决这个问题
# 1 楼答案
我以前也遇到过这样的问题。这是许多版本以前的版本,我认为JRuby的方法匹配算法随着时间的推移已经有所改进。您正在使用最新的JRuby吗
如果其他方法无效,则可能需要添加另一个方法或包装器类。通过名称或参数数量而不仅仅是参数类型来区分方法的东西
# 2 楼答案
您可以使用
java.lang.Class.for_name
修复该cannot convert instance of class org.jruby.RubyModule to class java.lang.Class
在你的情况下,是这样的
这是因为java接口在默认情况下成为Ruby模块,java方法的第二个参数需要一个类对象数组
您可以打印匹配的方法,以查看它是否与预期的方法匹配。 例如,我看到下面的代码与系统上的println(字符串)匹配。出去