首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将scala未来转换为java未来

将scala未来转换为java未来
EN

Stack Overflow用户
提问于 2015-02-02 12:31:21
回答 3查看 7.1K关注 0票数 17

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

代码语言:javascript
复制
public Future<?> getCustomersAsync(AsyncHandler<Customer> asyncHandler);

我想用Akka来实现它。我写了以下文章:

代码语言:javascript
复制
override def getCustomerAsync(asyncHandler: AsyncHandler[Customer]): Future[_] = {
  myActorRef.ask(GetCustomer, system.actorOf(Props[Responder]))
}

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

代码语言:javascript
复制
Error:(33, 17) type mismatch;
 found   : scala.concurrent.Future[Any]
 required: java.util.concurrent.Future[?]
    myActorRef.ask(GetCustomer, system.actorOf(Props[Responder]))
                  ^

我怎样才能进行这种转换?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-02 18:35:54

转换它们是不实际的,因为scala Future不提供中断或任何其他取消机制的功能。因此,没有直接的完全证明的方式来取消一个未来通过中断或其他通过方法调用在未来。

因此,最简单的解决方案是,如果不希望取消,则如下:

代码语言:javascript
复制
  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。但我不推荐它,因为它摇摇欲坠

票数 5
EN

Stack Overflow用户

发布于 2019-04-02 02:27:14

在启动Scala 2.13时,标准库包括scala.jdk.FutureConverters,它提供Scala到Future的转换(反之亦然):

代码语言:javascript
复制
import scala.jdk.FutureConverters._

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

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

代码语言:javascript
复制
import scala.jdk.javaapi.FutureConverters;

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

Stack Overflow用户

发布于 2015-02-02 16:44:39

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28277843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档