Scala和Java互操作。未来

时间:2013-04-18 16:19:01

标签: java scala scala-collections scala-2.10 scala-java-interop

在这个问题中,我必须调用第三方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中,但是没有办法以一种中断包装的Scala-Future的方式实现Java-Future方法def cancel(mayInterruptIfRunning: Boolean): Boolean(如果不这样请让我知道)。

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

  1. 无论如何都要编写包装器,忽略cancel上的调用(或抛出NotImplementedError
  2. someScalaFunction更改为可能会返回一个闭包,然后由Scala或Java Future中的调用者包装。
  3. 1.问题是某些客户可能依赖cancel的正确实现,但可能不是很关键。 2.会导致一个非常难看的api。

1 个答案:

答案 0 :(得分:3)

请注意,cancel仅尝试取消任务,根据Javadoc无法保证。因此,您实际上不必实现它来执行某些操作 - 取决于未来的计算是什么,忽略cancel调用可能不是整个应用程序的后续步骤。

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

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

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

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

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