覆盖JRuby中重载的重载Java方法

时间:2011-10-07 02:10:04

标签: java ruby jruby

假设我有一个像这样的Java类:

public class MyClass {
  public void doSomething(Object o1) { }
  public void doSomething(Object o1, Object o2) {}
}

请注意,有两种doSomething方法具有不同的arities。

在JRuby中,我如何对这个类进行子类化并为doSomething的每个arity提供实现?有没有办法在Java中添加一个简单的类来简单地将方法调用路由到具有明确名称的ruby方法?

谢谢!

2 个答案:

答案 0 :(得分:1)

在Ruby中,在同一个类中,不能有更多同名的方法。但是,您可能有一个带有变量参数和分派的方法,具体取决于参数的数量,请查看以下文章:http://rubylearning.com/satishtalim/ruby_overloading_methods.html

除了Dave Newton的参考,这是正确的解决方案。 JRuby将具有相同名称的所有Java方法路由到一个Ruby方法。您可以从那里发送任意内容。所以在这种情况下,以下Ruby就足够了:

class MyRubyClass < MyClass

  ...

  def doSomething(*args)
    ... do something with args ...
  end
end

答案 1 :(得分:1)

请参阅https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby

特别是,请查看java_send,您可以使用它来指定要调用的Java方法。

obj = MyClass.new
obj.java_send :doSomething, [Java::Object], o1
obj.java_send :doSomething, [Java::Object, Java::Object], o1, o2