1

我正在尝试从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

我环顾四周,但没有成功。

感谢提前!

4

1 回答 1

0

以下是解决此问题的方法:

所以vertx.eventBus.sendFuture返回一个Future[Message[T]. FutureonComplete方法接受一个参数,它是一个函数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 f
def 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 it
vertx.eventBus.sendFuture("anAddress", "message 1").onComplete(f)

=== 小编辑添加简单说明 ==

看一下附图:

在此处输入图像描述

红色的代码实际上是一个函数的主体,它没有名称(匿名),编译器需要知道其签名(它的参数和它们的类型)。

这样做.onComplete { ...or.onComplete(f)是相同的,但如果您f在其他地方定义,您已经定义了它的签名。如果没有,你需要这样做.onComplete { x: Try[Message[_]] => ...

(小提醒:在 Scala 中,您可以定义这样的函数val double = (i: Int) => { i * 2 }

于 2019-07-16T20:41:28.947 回答