Ruby 中的 Java 匿名接口(interface)实现

标签 java ruby jruby

我想在 Ruby 中转换以下 java 匿名接口(interface)实现。我是 Ruby 编码新手。

DiscoveryHandler discoveryHandler = new DiscoveryHandler() {
    List<DiscoveredPrinter> printers = new ArrayList<DiscoveredPrinter>();

    public void foundPrinter(DiscoveredPrinter printer) {
        printers.add(printer);
    }

    public void discoveryFinished() {
        for (DiscoveredPrinter printer : printers) {
            System.out.println(printer);
        }
        System.out.println("Discovered " + printers.size() + " printers.");
    }

    public void discoveryError(String message) {
        System.out.println("An error occurred during discovery : " + message);
    }
};

其中 DiscoveryHandler 是一个 Java 接口(interface),其中包含三个方法。 1. 找到打印机() 2. 发现完成() 3. 发现错误() 我认为,在创建其实例(在上面的情况下 discoveryHandler )时应该覆盖它。我不知道。 提前致谢。

最佳答案

如果接口(interface)只有一个方法(或其 Java 8 函数式方法),您可以简单地通过在方法采用 DiscoveryHandler 作为其最后一个参数的位置上使用 block 来实现它,例如:

someJavaObject.registerHandler do |printer| # foundPrinter(printer)
  printers.add printer # assuming registerHandler(DiscoveryHandler)
end

也可以使用单个 block 实现多个接口(interface)方法,在这种情况下,您可以将 Java 方法名称作为第一个 block 参数。

从您的示例来看,不清楚接口(interface)方法是什么,而且您似乎没有 JRuby block 到 iface 转换的用例,尤其是。因为你拥有一个国家。

关于Ruby 中的 Java 匿名接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33360641/

相关文章:

java - 亚马逊 MWS:报告和订单列表之间的区别

java - 强制停止我的包后,Android 正在终止我的前台服务

ruby - 无法从 macOS Catalina 10.15.1 卸载旧版本的 gem

ruby-on-rails - 如何使用 apache2 和 apache tomcat 服务器部署 rails 应用程序

java - 使用 Java 读取远程文件

java - Nimbus 中的 JTabbedPane,每个选项卡具有不同的颜色

小型 VM 上的 Ruby 1.9.1 或 Ruby 1.8.7 企业版?

ruby-on-rails - Rails 回调更改属性

ruby - 比 JSON 更快的简单序列化? (在 ruby 中)

JRuby 中的 Java 反射 : Determining class of java. util.regex.Pattern