Scala和Java互操作。未来
在这个问题中,我必须调用一个第三方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.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将来包装该闭包cancel
的正确实现,但可能不是很关键。
2.将导致一个非常丑陋的api。请注意,
cancel
仅尝试取消任务,根据Javadoc,没有任何保证。因此,您实际上不必实现它来做一些事情——这取决于未来的计算是什么,忽略cancel
调用对于整个应用程序可能不是后续的
如果您确实需要取消它,请参阅以获得半个解决方案
否则,您可以使用第二种解决方案——通过一些隐式转换,您可以使它看起来更好
object JavaInterOp {
implicit def f2future[F[_]](f: () => T): java.util.concurrent.Future[T] = fc(f)
}
这样,导入控制要提供的转换以及转换时间
其中的一个问题是,它可能会在你并不真正想要的地方进行转换——它可能会产生令人惊讶的效果