Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jruby中重写java方法的问题_Java_Ruby_Jruby - Fatal编程技术网

jruby中重写java方法的问题

jruby中重写java方法的问题,java,ruby,jruby,Java,Ruby,Jruby,我在从jruby类重写java方法时遇到了一些问题。由于JRuby公开了带有驼峰语法和蛇形语法的java方法,我尝试了两种方法来覆盖同一个方法,但我得到了奇怪的结果: 爪哇 红宝石 我做错什么了吗?虽然乍一看让人困惑,但一旦你理解了alias,这是“预期的” MyJavaClass#myMethod将由JRuby运行时设置一个myu方法别名 在myrubycass1中,您重新定义了myu方法(别名),从而看到了预期的输出。 但是,您没有覆盖myMethod->该约定不向后工作 在myrubyca

我在从jruby类重写java方法时遇到了一些问题。由于JRuby公开了带有驼峰语法和蛇形语法的java方法,我尝试了两种方法来覆盖同一个方法,但我得到了奇怪的结果:

爪哇

红宝石


我做错什么了吗?

虽然乍一看让人困惑,但一旦你理解了alias,这是“预期的”

MyJavaClass#myMethod
将由JRuby运行时设置一个
myu方法
别名

myrubycass1
中,您重新定义了
myu方法(别名),从而看到了预期的输出。
但是,您没有覆盖
myMethod
->该约定不向后工作

myrubycass2
中,您重新定义了
myMethod
,因此它最终从
invokeMethod()
执行虚拟Java分派,这是预期的


虽然这可能会让人感到困惑,但Java别名约定确实适用于“裸”用户。如果要扩展Java类,则应坚持使用正确的Java名称。在生成代理类后重新定义Java别名还有改进的余地,尽管这可能是一个突破性的改变。

我认为JRuby会自动将方法名从Java的camelCase转换为ruby的snake_
package tabaqui;

class MyJavaClass {
  public void myMethod() {
    System.out.println("Java method");
  }

  public void invokeMyMethod() {
    myMethod();
  }
}
class MyRubyClass1 < Java::tabaqui.MyJavaClass
  def my_method
    puts "Ruby method from MyRubyClass1\n";
  end
end

class MyRubyClass2 < Java::tabaqui.MyJavaClass
  def myMethod
    puts "Ruby method from MyRubyClass2\n";
  end
end

a = MyRubyClass1.new
a.my_method          #output: "Ruby method from MyRubyClass1"
a.invoke_my_method   #output: "Java method"

b = MyRubyClass2.new
b.my_method          #output: "Java method"
b.invoke_my_method   #output: "Ruby method from MyRubyClass2"
alias_method :myMethod, :my_method