gpt4 book ai didi

java - 如何从 JRuby 获取 Java 接口(interface)的类型正确的 ruby​​ 实现?

转载 作者:行者123 更新时间:2023-12-02 08:25:26 24 4
gpt4 key购买 nike

我正在尝试从 Java 应用程序使用 JRuby(通过 JRuby 1.5 中包含的 JSR233 接口(interface))来加载 Java 接口(interface)的 ruby​​ 实现。

我的示例实现如下所示:

界面:

package some.package;
import java.util.List;
public interface ScriptDemoIf {
int fibonacci(int d);
List<String> filterLength(List<String> source, int maxlen);
}

Ruby 实现:

require 'java'
include Java

class ScriptDemo
java_implements some.package.ScriptDemoIf
java_signature 'int fibonacci(int d)'
def fibonacci(d)
d < 2 ? d : fibonacci(d-1) + fibonacci(d-2)
end

java_signature 'List<String> filterLength(List<String> source, int maxlen)'
def filterLength(source, maxlen)
source.find_all { |str| str.length <= maxlen }
end
end

类加载器:

public ScriptDemoIf load(String filename) throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("jruby");
FileReader script = new FileReader(filename);
try {
engine.eval(new FileReader(script));
} catch (FileNotFoundException e) {
throw new ScriptException("Failed to load " + filename);
}
return (ScriptDemoIf) m_engine.eval("ScriptDemo.new");
}

(显然,加载器在现实生活中更通用 - 它不假设实现类名称是“ScriptDemo” - 这只是为了简单起见)。

问题 - 我在加载程序的最后一行遇到类转换异常 - engine.eval() 返回一个 RubyObject 类型,该类型不能很好地转换到我的界面。从我在网上阅读的内容来看,我的印象是,Ruby 部分中使用 java_implements 的全部目的是为了正确编译接口(interface)实现。

我做错了什么?

最佳答案

应该是的,但不幸的是还没有完全按照这种方式连接。目前,#java_implements#java_signature 仅由基于 Ruby 类创建 Java 源文件的 jrubyc --java 命令使用。您可能需要考虑将其用于 Ruby 集成。

我们的目标是让这个示例将来适用于预编译脚本和运行时执行的脚本。如果您希望此脚本按预期工作,请尝试使用 include Java::some.package.ScriptDemoIf 而不是 java_implements

关于java - 如何从 JRuby 获取 Java 接口(interface)的类型正确的 ruby​​ 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4617364/

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