Scala 编译错误 Vert.x 响应未来

我正在尝试从https://vertx.io/docs/vertx-core/scala/#_the_event_bus_api复制代码,但出现编译错误。


override def start(): Unit = {

    vertx.eventBus.sendFuture("anAddress", "message 1").onComplete {

      case Success(result) => {

        println("The handler un-registration has reached all nodes")

      }

      case Failure(cause) => {

        println(s"$cause")

      }

    }

  }

我收到此错误:


missing parameter type for expanded function

The argument types of an anonymous function must be fully known. (SLS 8.5)

Expected type was: scala.util.Try[io.vertx.scala.core.eventbus.Message[?]] => ?

    vertx.eventBus.sendFuture("anAddress", "message 1").onComplete {

                                                                   ^

我该如何解决这个问题?


我正在使用 Scala 2.12.8 和 Vert.x 3.7.1


我环顾四周但没有成功。


感谢提前!


江户川乱折腾
浏览 123回答 1
1回答

呼如林

解决方法如下:所以vertx.eventBus.sendFuture返回一个Future[Message[T]。 Future的onComplete方法采用一个参数,它是一个函数f: (Try[T]) => U。你在那里做的是你正在使用一个必须完全声明参数类型的匿名函数。您需要指定签名的签名f。我猜有两个选择:1)vertx.eventBus.sendFuture("anAddress", "message 1").onComplete { x: Try[Message[_]] =>  x match {    case Success(result) => {      println("The handler un-registration has reached all nodes")    }    case Failure(cause) => {      println(s"$cause")    }  }}2)// define fdef f(x: Try[Message[_]]) = x match {  case Success(result) => {    println("The handler un-registration has reached all nodes")  }  case Failure(cause) => {    println(s"$cause")  }}// and later use itvertx.eventBus.sendFuture("anAddress", "message 1").onComplete(f)=== 稍作编辑以添加简单的解释==看看附图:红色的代码实际上是一个没有名字(匿名)的函数体,编译器需要知道它的签名(它的参数和它们的类型)。这样做.onComplete { ...或是.onComplete(f)相同的,但如果您f在其他地方定义,您已经定义了它的签名。如果没有,你需要这样做.onComplete { x: Try[Message[_]] => ...。(小提醒:在 Scala 中你可以这样定义函数val double = (i: Int) => { i * 2 })
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java