JRuby 不明确的方法

问题描述 投票:0回答:1

我使用 JRuby 作为 VertX 应用程序中快速脚本编写的一部分,但我对 Vertx-Future 的完成回调有点困难:

    def process(connection) # connection is a io.vertx.sqlclient.SqlConnection
      tx = connection.begin()  
      tx.onComplete( -> succ {
        if (succ.failed()) 
          msgFailed(result.cause())
        else
          processChangeUserLanguage(connection)
        end
      })
    end

tx 是一个 Java 类 https://vertx.io/docs/apidocs/io/vertx/core/Future.html tx.onComplete 采用一个参数 https://vertx.io/docs/apidocs/io/vertx/core/Handler.html

但是 JRuby 发出信号

warning: multiple Java methods found. Choosing onComplete(io.vertx.core.Handler)

目前它基本上使用了正确的定义并且一切正常。有没有办法定义或粘贴“succ”lambda 回调到 io.vertx.core.Handler 类?

谢谢 尼克

jruby vert.x
1个回答
0
投票

我没有重现你的警告,但我猜测这与 VertX Future 接口实际上有两个 onComplete 方法有关:一个需要单个处理程序(这是你的方法)我想必正在尝试使用)和另一个实用程序包装器,它采用两个处理程序并在成功时调用第一个处理程序,在失败时调用第二个处理程序。

我不是 100% 确定 为什么 JRuby 认为这种情况是不明确的:你显然是在传递一个 lambda,并且方法调用之后没有任何块可以解释为你试图将一个 proc 作为第二个传递通过闭包转换进行论证。它甚至可能是 JRuby 方法解析中的一个错误。

无论如何,摆脱警告并强制调用正确方法的一种(有点丑陋但可靠)方法是使用 java_send:

      tx.java_send(:onComplete, [io.vertx.core.Handler], -> succ {
        # ...
      })

或者,您可以尝试仅用一个块替换 lambda:

      tx.onComplete do |succ|
        # ...
      end

请注意,我不知道此更改是否会真正完成任何操作,或者它是否只会生成与之前相同的警告。但如果警告确实与闭包转换有某种关系,它可能足以摆脱它。

© www.soinside.com 2019 - 2024. All rights reserved.