将scala future转换为java future

将scala future转换为java future,java,scala,akka,future,scala-java-interop,Java,Scala,Akka,Future,Scala Java Interop,我有一个生成的java接口,其中包含一个方法: public Future<?> getCustomersAsync(AsyncHandler<Customer> asyncHandler); 问题是ask返回scala.concurrent.Future[Any],并且该方法必须返回java.util.concurrent.Future[?]: 错误:(33,17)类型不匹配; 找到:scala.concurrent.Future[任何] 必需:java.util.c

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

public Future<?> getCustomersAsync(AsyncHandler<Customer> asyncHandler);
问题是
ask
返回
scala.concurrent.Future[Any]
,并且该方法必须返回
java.util.concurrent.Future[?]

错误:(33,17)类型不匹配;
找到:scala.concurrent.Future[任何]
必需:java.util.concurrent.Future[?]
myActorRef.ask(GetCustomer,system.actorOf(Props[Responder]))
^

如何进行这种转换?

我认为没有一种简单的方法可以将scala Future转换为java Future。一种可能的解决方案是用java future包装scala future,但必须将新任务传递给线程池,请参见java文档:

转换它们并不实际,因为scala
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
    }
  }
但如果您仍然需要取消,则残疾人修复将如图所示


。但我不建议使用它,因为它的起点是Scala 2.13,标准库包括Scala到Java的未来转换(反之亦然):


能否请您提供转换后的期货如何处理取消的信息?
  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
    }
  }
import scala.jdk.FutureConverters._

// val scalaFuture: scala.concurrent.Future[Int] = Future.successful(42)
scalaFuture.asJava
// java.util.concurrent.CompletionStage[Int] = <function1>
import scala.jdk.javaapi.FutureConverters;

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