gpt4 book ai didi

java - Scala 和 Java 互操作。 future 的

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:41 26 4
gpt4 key购买 nike

在这个问题中,我必须调用第三方 Java 库,该库需要一个 java.util.concurrent.Future,Scala 例程的结果返回一个 scala.concurrent.Future 例如。

def someScalaFunction(): scala.concurrent.Future[T]

def otherJavaMethod(arg: java.util.concurrent.Future[T]) = ...

我会将 Scala-Future 包装到一个新的 Java-Future 中,但是无法以中断的方式实现 Java-Future 方法 def cancel(mayInterruptIfRunning: Boolean): Boolean包装好的 Scala-Future(如果没有,请告诉我)。

我该如何解决这个问题?这些是我想出的方法:

  1. 无论如何都要编写包装器并忽略对cancel 的调用(或抛出一个NotImplementedError)
  2. 更改 someScalaFunction 以可能返回一个闭包,然后调用者将其包装在 Scala 或 Java Future 中。

问题 1. 是某些客户端可能依赖于 cancel 的正确实现,但可能不是很关键。2. 会导致一个非常难看的 api。

最佳答案

请注意,cancel 仅尝试取消任务,根据 Javadoc 没有任何保证。因此,您实际上不必实现它来做某事——取决于 future 的计算是什么,忽略 cancel 调用可能不会对整个应用程序产生影响。

如果您确实需要取消它,请参阅this question对于半解决方案。

否则,您可以使用第二个解决方案——在一些隐式转换的帮助下,您可以使它看起来更好。

object JavaInterOp {
implicit def f2future[F[_]](f: () => T): java.util.concurrent.Future[T] = fc(f)
}

这样,导入可以控制您要提供的转换以及提供的时间。

这样做的一个问题是它可能会在您并不真正想要的地方进行转换——它可能会产生令人惊讶的效果。

关于java - Scala 和 Java 互操作。 future 的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16088169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com