2011-06-04 56 views
3

我從JRuby調用Java方法時遇到了一個奇怪的問題。JRuby調用錯誤的方法

在我的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))

這一次沒有錯誤,但錯誤的方法被稱爲...

我怎樣才能解決這個問題呢?

回答

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接口成爲紅寶石模塊默認情況下,第二個參數來:java_method預計類的數組對象。

您可以打印匹配的方法以查看它是否符合預期的方法。 例如,我看到下面的代碼與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)> 
0

我以前遇到過這樣的問題。之前版本很多,我認爲JRuby的方法匹配算法隨着時間的推移已經有所改進。你在使用最新的JRuby嗎?

如果沒有其他工作,您可能需要添加另一個方法或包裝類。通過名稱或參數數量區分您的方法的東西,不僅僅是參數類型。