在这个问题中,我必须调用第三方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
(如果不这样请让我知道)。
我该如何解决这个问题?这些是我提出的方法:
cancel
上的调用(或抛出NotImplementedError
)someScalaFunction
更改为可能会返回一个闭包,然后由Scala或Java Future中的调用者包装。 1.问题是某些客户可能依赖cancel
的正确实现,但可能不是很关键。
2.会导致一个非常难看的api。
答案 0 :(得分:3)
请注意,cancel
仅尝试取消任务,根据Javadoc无法保证。因此,您实际上不必实现它来执行某些操作 - 取决于未来的计算是什么,忽略cancel
调用可能不是整个应用程序的后续步骤。
如果您确实需要取消它,请参阅this question了解半解决方案。
否则,你可以使用你的第二个解决方案 - 在一些隐式转换的帮助下,你可以使它看起来更好。
object JavaInterOp {
implicit def f2future[F[_]](f: () => T): java.util.concurrent.Future[T] = fc(f)
}
这样,导入控制您要提供的转换以及何时转换。
这个问题的一个问题是它可能会在您不想要它的地方进行转换 - 它可能会产生令人惊讶的效果。