【问题标题】:Scala and Java interop. of FutureScala 和 Java 互操作。未来的
【发布时间】:2013-04-11 21:01:10
【问题描述】:

在这个问题中,我必须调用一个第三方 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 中。

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

【问题讨论】:

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


    【解决方案1】:

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

    如果您确实需要取消它,请参阅this question 以获得一半的解决方案。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2012-04-11
      • 1970-01-01
      相关资源
      最近更新 更多