Scala和Java互操作。未来

Scala和Java互操作。未来,java,scala,scala-collections,scala-2.10,scala-java-interop,Java,Scala,Scala Collections,Scala 2.10,Scala Java Interop,在这个问题中,我必须调用一个第三方Java库,该库需要一个Java.util.concurrent.Future,其结果来自一个返回Scala.concurrent.Future的Scala例程,例如 def someScalaFunction(): scala.concurrent.Future[T] def otherJavaMethod(arg: java.util.concurrent.Future[T]) = ... 我想将Scala Future包装成一个新的Java Futur

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

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

def otherJavaMethod(arg: java.util.concurrent.Future[T]) = ...
我想将Scala Future包装成一个新的Java Future,但是没有办法实现Java Future方法
def cancel(maybruptfrunning:Boolean):Boolean
,它会中断包装好的Scala Future(否则请告诉我)

我怎样才能解决这个问题?以下是我提出的方法:

  • 无论如何都要编写包装,只需忽略对
    cancel
    的调用(或抛出
    NotImplementedError
  • 更改
    someScalaFunction
    ,可能返回一个闭包,然后调用方将在Scala或Java将来包装该闭包
  • 1的问题。一些客户端可以依赖于
    cancel
    的正确实现,但可能不是很关键。
    2.将导致一个非常丑陋的api。

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

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

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

    object JavaInterOp {
      implicit def f2future[F[_]](f: () => T): java.util.concurrent.Future[T] = fc(f)
    }
    
    这样,导入控制要提供的转换以及转换时间

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