Ошибка компиляции в Scala Vert.x

Я пытаюсь повторить код из https://vertx.io/docs/vertx-core/scala/, но я получил ошибку компиляции.

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

Я посмотрел вокруг, но безуспешно.

Спасибо заранее!

1 ответ

Решение

Вот как это решить:

Так vertx.eventBus.sendFuture возвращает Future[Message[T], Future "s 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 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 { ... или же .onComplete(f) то же самое, но если вы определите f в другом месте вы уже определили его подпись. Если нет, вам нужно сделать это так .onComplete { x: Try[Message[_]] => ...,

(Небольшое напоминание: в Scala вы можете определять функции, подобные этой val double = (i: Int) => { i * 2 })

Другие вопросы по тегам