加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

将scala未来转化为java未来

发布时间:2020-12-16 09:11:26 所属栏目:安全 来源:网络整理
导读:我有一个生成的 java接口包含一个方法: public Future? getCustomersAsync(AsyncHandlerCustomer asyncHandler); 我想用Akka实现它.我写了以下内容: override def getCustomerAsync(asyncHandler: AsyncHandler[Customer]): Future[_] = { myActorRef.ask(
我有一个生成的 java接口包含一个方法:

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

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

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

问题是请求返回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]))
                  ^

我该怎么做这个转换?

解决方法

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

但是如果您仍然需要取消,那么残疾人修复将如图所示

here.但是我不会推荐它,因为它摇摇欲坠

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读