将scala future转换为java future

时间:2015-02-02 12:31:22

标签: java scala akka future scala-java-interop

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

public Future<?> getCustomersAsync(AsyncHandler<Customer> asyncHandler);

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

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

问题是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]))
                  ^

我该如何进行转换?

3 个答案:

答案 0 :(得分:4)

转换它们是不切实际的,因为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
    }
  }

但是如果您仍然需要cancel,则有障碍的修复将如图所示

here。但我不推荐它,但它不稳定

答案 1 :(得分:2)

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

import scala.jdk.FutureConverters.Ops._

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

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

import scala.jdk.FutureConverters;

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

答案 2 :(得分:1)

我认为没有一种简单的方法可以将scala Future转换为java Future。一种可能的解决方案是通过java future来包装scala future,但是你必须将新任务传递给线程池,请参阅java docs: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html