当前位置: 首页 > 知识库问答 >
问题:

Scala 和 Java 互操作。未来

严誉
2023-03-14

在这个问题中,我必须调用一个第三方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中,但是没有办法实现Java-Future方法< code > def cancel(mayinterruptirunning:Boolean):Boolean ,因为它会中断封装的Scala-Future(否则请告诉我)。

我该如何解决这个问题?这些是我想到的方法:

  1. 无论如何都要编写包装器,然后忽略对取消的调用(或抛出一个Not实作错误
  2. 更改一些ScalaFunction以可能返回一个闭包,然后由调用者包装在Scala或JavaFuture中。

1的问题。一些客户端可以依赖于< code>cancel的正确实现,但这可能不是很关键。2.会导致一个非常难看的api。

共有1个答案

蒋乐意
2023-03-14

请注意,取消仅尝试取消任务,根据Javadoc没有保证。因此,您实际上不必实现它来执行某些操作 - 根据将来的计算结果,忽略取消调用可能不会对整个应用程序产生后续作用。

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

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

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

通过这种方式,导入可以控制您想要提供的转换以及何时提供。

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

 类似资料:
  • 问题内容: 我已经读过Clojure vs. Scala的各种论述,而我意识到两者都有自己的位置。关于将Clojure和Scala进行比较时,有一些注意事项尚未得到完整的解释: 1.)两种语言中哪一种通常 更快 ?我意识到这从一种语言功能到另一种语言功能都会有所不同,但是对性能进行总体评估会有所帮助。例如:我知道Python字典的速度非常快。但作为一个整体,它是一个 多 比Java慢语。我不想和C

  • 问题内容: 我正在学习Scala,并且有一个Java项目可以迁移到Scala。我想通过逐个重写类并检查新类没有破坏项目来迁移它。 该Java项目使用和。在新的Scala类中,我想使用Scala 并拥有漂亮的Scala代码。 问题在于新类(在Scala中添加了新类)无法与现有Java代码无缝集成:Java需要,Scala需要自己的。 这是问题的简化示例。有 Main , Logic , Dao类 。

  • Java 互操作 Clojure程序可以使用所有的java类以及接口。和在java里面一样 java.lang 这个包里面的类是默认导入的。你可以手动的用 import 函数来导入其它包的类。看例子: (import '(java.util Calendar GregorianCalendar) '(javax.swing JFrame JLabel)) 同时也可以看下宏ns下面的 [:

  • JavaScript 互操作 调用宿主语言代码最直接的办法就是通过 interop. JavaScript 的全局变量可以通过 js 命名空间访问. 对象的方法调用可以写成: (.log js/console "demo") ; console.log('demo') 访问对象的属性需要添加连字符: (.-name obj) ; obj.name 对象的实例化可以用 cljs 写, 注意结尾有点号

  • ed25519 java和js nacl都实现了ed25519加密签名方法。然而,我从ed25519 java获得了一个公钥和一个签名消息(使用公钥对应的私钥签名),并尝试在js中使用公钥验证签名消息。这给出了一个值,即签名的消息不能用公钥打开。 我的问题是,难道不能在Java中登录并在Javascript中验证签名吗?如果是,或者不是,原因是什么? Java代码: 检查有效调用返回true。 输

  • 问题内容: 我们公司有一个基于Python的网站和一些基于Python的工作程序节点,它们通过Django / Celery和RabbitMQ进行通信。我有一个基于Java的应用程序,需要将任务提交给基于Celery的工作人员。我可以将作业从Java发送到RabbitMQ很好,但是基于Celery的工作人员从来没有接过工作。从查看两种类型的作业提交的数据包捕获来看,存在差异,但是我无法理解如何解释