gpt4 book ai didi

java - 在 jruby 中重写 java 方法时出现问题

转载 作者:行者123 更新时间:2023-12-02 11:00:52 25 4
gpt4 key购买 nike

我在覆盖 jruby 类中的 java 方法时遇到了一些麻烦。由于 JRuby 使用驼峰语法和蛇形语法公开了 java 方法,因此我尝试了两种方法来重写相同的方法,但我得到了奇怪的结果:

JAVA

package tabaqui;

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

public void invokeMyMethod() {
myMethod();
}
}

ruby

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"

我发现获得预期结果的唯一解决方案(在每种情况下调用 ruby​​ 方法)是在 ruby​​ 中定义被重写的方法后为其提供一个别名:

alias_method :myMethod, :my_method

我做错了什么吗?

最佳答案

虽然乍一看令人困惑,但一旦你理解了别名,这是“预期的”......

MyJavaClass#myMethod 将有一个由 JRuby 运行时设置的 my_method 别名。

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

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

虽然这看起来可能令人困惑,但 Java 别名约定确实是为“裸”消费者而存在的。而如果您要扩展 Java 类,则应该坚持使用正确的 Java 名称。一旦生成代理类,就需要重新定义 Java 别名,尽管这可能是一个重大更改,但仍有改进的空间。

关于java - 在 jruby 中重写 java 方法时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51339913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com