问题标签 [scala-java-interop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
192 浏览

java - Scala 不能引用 Java 类

我有一个用于国际象棋 AI 服务器的 Java 框架。我打算使用 Scala 为我的国际象棋 AI 编写逻辑。所以我需要编辑框架的“AI”类来调用我的Scala代码。

当我尝试从 Scala 中的 java 框架中引用一个类时,就会出现我的问题,并且我收到一个遵循此模式的错误:

我能找到的最相关的事情是: scala 访问限定符的保证是什么?,但是这对我一点帮助都没有。

接下来我发现:.java 和 .scala 类之间是否可能存在循环依赖关系? 我将尝试设置一个 maven 解决方案,但最终我需要使用 make 编译它,并使用 shell 脚本运行它

创建虚拟类似乎是一个糟糕的解决方案。我不想继续编辑框架,重新编译它,并修复它对调用我的 Scala 类的任何抱怨。

我有点困惑为什么这是一个问题。我可以使用 Java 语法调用任何本机 Java 函数,没问题。为什么会发生这种情况,即使我已将框架放入 jar 并以这种方式引用它?

0 投票
3 回答
30995 浏览

java - 在 Scala 中使用 Java 库

我是 Scala 的新手。到目前为止,我只能编写基本代码,但我想开始更具体地使用它,而不仅仅是学习理论。

假设我在HelloWorld.java中有以下 Java 代码:

从 Scala 调用它的代码是什么?

0 投票
1 回答
178 浏览

java - Scala:“val”作为可能的标识符?链接到 java 库需要它

在我的 scala 代码中,我使用了一个 java 库,它定义了一个具有名为“val”的公共属性的对象:

有没有办法在scala中获得这个属性?

0 投票
1 回答
1329 浏览

scala - 将 Scala 反射与 Java 反射结合使用

作为 DSL 的一部分,我有很多代码一直在使用 Java 反射来调用 Java 对象上的任意用户指定方法。

但是,实际上,这些 Java 对象中有很多是 Scala 对象,并且它们上的一些方法用 Scala@deprecated注释进行了标记。不幸的是,Java 的注解机制不能看到 Scala 的注解,并且在 Scala 2.10 之前没有方便的方法(我知道吗?)来访问这些注解。

我终于升级到 2.10,并且希望能够从我的 DSL 发出弃用警告。但是,我不想重写整个评估器(至少现在)以使用 Scala 反射,所以有没有一种方便的方法可以从 ajava.lang.reflect.Method转到我可以使用 Scala 反射来确定 Scala 方法是否在问题已弃用?或者我是否必须使用 Scala 反射复制大量现有的方法解析逻辑才能获得该信息?

它看起来像一个JavaToScala曾经存在于 Scala 反射中的类,其中有一个methodToScala方法可以满足我的要求。我能找到的唯一痕迹是在这里,在一个谷歌代码项目中。为什么功能从核心反射中移出?或者它仍然以不同的名称存在?

编辑:看起来有问题的代码存在于 中scala.reflect.runtime.JavaMirrors,但不幸的是它是私有的(还有另一个JavaMirrors是公共 API 的一部分,但没有提供我需要的任何东西。)我无法弄清楚如果有一条通过公共 API 调用的“路径”将我一直带到methodAsScala隐藏在 private 中的 private JavaMirrors。至少可以这么说,这令人沮丧:(

0 投票
2 回答
234 浏览

android - 使用 Scala 的替代方法调用 Java 方法

我正在尝试使用来自 Scala 的 Android APIput中的类的方法ContentValues,但我想不出一种方法来使 Scala 缩小列表元素的类型。例如 :

...产生一个错误,粗略地说它无法解决“具有替代方案的重载put方法”put(String, String)put(String, Int),...

我的直觉告诉我我可能应该使用反射,但我无法弄清楚如何准确地做到这一点。任何指针?

0 投票
1 回答
79 浏览

java - 与 Java 交互时的 Scala 类型/集合,反之亦然

当与 java 中的 scala 库或 scala 中的 java 库交互时,是否存在某些类型或集合不能有效映射,因此您必须执行“昂贵”操作才能执行转换?

例如,在记忆方面,您可能需要保存 2 个集合的副本?

0 投票
1 回答
1343 浏览

java - Scala 和 Java 互操作。未来的

在这个问题中,我必须调用一个第三方 Java 库,该库期望 ajava.util.concurrent.Future具有来自 Scala 例程的结果scala.concurrent.Future,例如返回 a 。

我会将 Scala-Future 包装到一个新的 Java-Future 中,但是没有办法以def cancel(mayInterruptIfRunning: Boolean): Boolean中断包装的 Scala-Future 的方式实现 Java-Future 方法(否则请告诉我)。

我怎么解决这个问题?这些是我想出的方法:

  1. 无论如何都要编写包装器,然后忽略调用cancel(或抛出NotImplementedError
  2. 更改someScalaFunction为可能返回一个闭包,然后由调用者将其包装在 Scala 或 Java Future 中。

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

0 投票
1 回答
263 浏览

scala - 在 Scala 2.10 中使用混合的复杂 Java 泛型集合

在我工作的公司中,我们从(Java)模式中获得了很多好处,可以总结如下:

我们可以通过他们的特殊/智能“ids”获得一些“东西”。每个“事物”都知道它的 id,并且 id 是“聪明的”,因为您可以要求他们给您他们识别的“事物”。在一个复杂的、不断增长的“事物”层次结构中,这简化了维护并消除了很多代码(重复和其他)。我敢肯定,你们中的一些人可能会觉得这很奇怪,我可以解释为什么会这样,但事实是它就是这样,到目前为止它很有帮助,不是问题的一部分。

Java 对 this 的定义总结如下(稍作改写):

有时,我们需要在给定一批不同 id 的情况下获取“一批”事物(这会通过网络,因此需要进行批处理以加快速度)。出于本描述的目的,它可以写成:

(方法参数只是id的多重性,它是一个集合,列表还是其他都没有关系)

现在,在网络的另一端,这个方法是在 Scala 2.9 中实现的,相当丑陋地避免了 Scala 泛型的严格性。我们正在尝试升级到 Scala 2.10,但事情不再编译,必须想办法解决这个问题。诀窍是有一个 Scala 方法总结如下:

该方法会根据许多因素适当地检查、处理和分配调用 - 在这里解释太多并且无关紧要。

现在,是 getManyThings() 方法迭代传递给它的 id,并需要将它们作为参数传递给 getOneThing()。那就是事情失败的地方。getManyThings() 只知道它获得的 id 本质上是 Id[ , ] 并且 Scala 抱怨 [ , ] 对于 getOneThing的 [I <: Id[I,T],T <: Thing[I,T]] 来说不够好() 要求:

注意 - 为 Id 和 Thing 声明非参数化(非泛型)基类并没有真正帮助,因为它只会将问题推到(太多)其他地方。我们选择了非常严格的类型以确保代码质量,但我们确实必须有一种方法来处理“混合”集合。

有什么帮助吗?请!

0 投票
5 回答
76375 浏览

list - 如何将 java.util.List 转换为 Scala 列表

我有这个带有以下错误的 Scala 方法。无法转换为 Scala 列表。

类型不匹配; 找到:java.util.List[com.aitrich.learnware.model.domain.entity.Question]需要: scala.collection.immutable.List[com.aitrich.learnware.model.domain.entity.Question]

0 投票
1 回答
186 浏览

scala - 在Scala中使用从Java类继承的方法

我正在尝试编译扩展 Java 类的 Scala 类文件。这是类定义,它是最基本的。在加载时,在宿主应用程序中,对象应该使用超类的方法 'post' 将“Hello from Scala”写入宿主的输出窗口。

这在应用程序中编译并运行良好。

这是我对 Scala 的翻译(老实说,我不是 100% 确定我完全理解 Scala 中的构造函数):

但是,当我尝试使用 scalac 进行编译时,我收到以下错误:

我不确定为什么编译器告诉我“post”不是成员函数,我确定我搞砸了 Scala 语法,但无法确定哪里出了问题。

谢谢!

编辑

这是 Max 窗口的输出,除了按如下规定更改代码外,我刚刚将 Scala 库添加到 Max 的动态加载路径中。这真让人兴奋