JRuby вызывает неправильный метод - PullRequest
3 голосов
/ 04 июня 2011

У меня возникла странная проблема с вызовом метода Java из JRuby .

В моем классе 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)) *

На этот раз ошибок нет, но вызывается неправильный метод ...

Как это исправитьпроблема?

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

Вы можете исправить это 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 по умолчанию и вторым аргументом для: java_method ожидает массив объектов Class.

Вы можете напечатать соответствующий метод, чтобы увидеть, что он соответствует предполагаемому методу.Например, я вижу ниже код соответствует println (String) на System.out.

>>java.lang.System.out.java_method "println", [java.lang.Class.for_name("java.lang.String")]
#<Method: Java::JavaIo::PrintStream#(java.lang.String)>
0 голосов
/ 06 июня 2011

У меня были такие проблемы раньше. Это было много версий назад, и я думаю, что алгоритм соответствия методов JRuby со временем улучшился. Вы используете последнюю версию JRuby?

Если больше ничего не работает, вам может понадобиться добавить другой метод или класс-оболочку. То, что отличает ваши методы по имени или количеству параметров, а не только от типа параметра.

...