3

在这个问题中,我必须调用一个第三方 Java 库,该库期望 ajava.util.concurrent.Future具有来自 Scala 例程的结果scala.concurrent.Future,例如返回 a 。

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

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

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

我怎么解决这个问题?这些是我想出的方法:

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

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

4

1 回答 1

3

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

如果您确实需要取消它,请参阅此问题以获得半解决方案。

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

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

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

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

于 2013-04-18T16:28:30.797 回答