Ошибка компиляции в 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 }
)