将scala future转换为java future

mir*_*lon 13 java scala future akka scala-java-interop

我有一个生成的java接口,包含一个方法:

public Future<?> getCustomersAsync(AsyncHandler<Customer> asyncHandler);
Run Code Online (Sandbox Code Playgroud)

我想用Akka实现它.我写了以下内容:

override def getCustomerAsync(asyncHandler: AsyncHandler[Customer]): Future[_] = {
  myActorRef.ask(GetCustomer, system.actorOf(Props[Responder]))
}
Run Code Online (Sandbox Code Playgroud)

问题是ask退货scala.concurrent.Future[Any]和方法必须返回java.util.concurrent.Future[?].

Error:(33, 17) type mismatch;
 found   : scala.concurrent.Future[Any]
 required: java.util.concurrent.Future[?]
    myActorRef.ask(GetCustomer, system.actorOf(Props[Responder]))
                  ^
Run Code Online (Sandbox Code Playgroud)

我该怎么做这个转换?

Xav*_*hot 7

开始Scala 2.13,标准库包括scala.jdk.FutureConverters提供 Scala 到 Java 的Future转换(反之亦然):

import scala.jdk.FutureConverters._

// val scalaFuture: scala.concurrent.Future[Int] = Future.successful(42)
scalaFuture.asJava
// java.util.concurrent.CompletionStage[Int] = <function1>
Run Code Online (Sandbox Code Playgroud)

请注意 Java 用户,您宁愿使用FutureConverters显式方式:

import scala.jdk.javaapi.FutureConverters;

// val scalaFuture: scala.concurrent.Future[Int] = Future.successful(42)
FutureConverters.asJava(scalaFuture);
// java.util.concurrent.CompletionStage[Int] = <function1>
Run Code Online (Sandbox Code Playgroud)


Jat*_*tin 5

好吧,转换它们是不切实际的,因为 ScalaFuture不提供中断功能或任何其他取消机制。因此,没有直接的完全证明方法可以通过中断或通过 Future 中的方法调用来取消 Future。

因此,如果不需要取消,最简单的解决方案是:

  def convert[T](x:Future[T]):java.util.concurrent.Future[T]={
    new concurrent.Future[T] {
      override def isCancelled: Boolean = throw new UnsupportedOperationException

      override def get(): T = Await.result(x, Duration.Inf)

      override def get(timeout: Long, unit: TimeUnit): T = Await.result(x, Duration.create(timeout, unit))

      override def cancel(mayInterruptIfRunning: Boolean): Boolean = throw new UnsupportedOperationException

      override def isDone: Boolean = x.isCompleted
    }
  }
Run Code Online (Sandbox Code Playgroud)

但是如果你仍然需要cancel,一个残疾人修复将如图所示

在这里。但我不会推荐它,因为它摇摇欲坠