问题标签 [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.
java - Scala 不能引用 Java 类
我有一个用于国际象棋 AI 服务器的 Java 框架。我打算使用 Scala 为我的国际象棋 AI 编写逻辑。所以我需要编辑框架的“AI”类来调用我的Scala代码。
当我尝试从 Scala 中的 java 框架中引用一个类时,就会出现我的问题,并且我收到一个遵循此模式的错误:
我能找到的最相关的事情是: scala 访问限定符的保证是什么?,但是这对我一点帮助都没有。
接下来我发现:.java 和 .scala 类之间是否可能存在循环依赖关系? 我将尝试设置一个 maven 解决方案,但最终我需要使用 make 编译它,并使用 shell 脚本运行它
创建虚拟类似乎是一个糟糕的解决方案。我不想继续编辑框架,重新编译它,并修复它对调用我的 Scala 类的任何抱怨。
我有点困惑为什么这是一个问题。我可以使用 Java 语法调用任何本机 Java 函数,没问题。为什么会发生这种情况,即使我已将框架放入 jar 并以这种方式引用它?
java - 在 Scala 中使用 Java 库
我是 Scala 的新手。到目前为止,我只能编写基本代码,但我想开始更具体地使用它,而不仅仅是学习理论。
假设我在HelloWorld.java中有以下 Java 代码:
从 Scala 调用它的代码是什么?
java - Scala:“val”作为可能的标识符?链接到 java 库需要它
在我的 scala 代码中,我使用了一个 java 库,它定义了一个具有名为“val”的公共属性的对象:
有没有办法在scala中获得这个属性?
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
。至少可以这么说,这令人沮丧:(
android - 使用 Scala 的替代方法调用 Java 方法
我正在尝试使用来自 Scala 的 Android APIput
中的类的方法ContentValues
,但我想不出一种方法来使 Scala 缩小列表元素的类型。例如 :
...产生一个错误,粗略地说它无法解决“具有替代方案的重载put
方法”put(String, String)
put(String, Int),...
。
我的直觉告诉我我可能应该使用反射,但我无法弄清楚如何准确地做到这一点。任何指针?
java - 与 Java 交互时的 Scala 类型/集合,反之亦然
当与 java 中的 scala 库或 scala 中的 java 库交互时,是否存在某些类型或集合不能有效映射,因此您必须执行“昂贵”操作才能执行转换?
例如,在记忆方面,您可能需要保存 2 个集合的副本?
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 方法(否则请告诉我)。
我怎么解决这个问题?这些是我想出的方法:
- 无论如何都要编写包装器,然后忽略调用
cancel
(或抛出NotImplementedError
) - 更改
someScalaFunction
为可能返回一个闭包,然后由调用者将其包装在 Scala 或 Java Future 中。
1. 的问题是某些客户端可以依赖正确的实现,cancel
但可能不是很关键。2.会导致一个非常丑陋的api。
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 声明非参数化(非泛型)基类并没有真正帮助,因为它只会将问题推到(太多)其他地方。我们选择了非常严格的类型以确保代码质量,但我们确实必须有一种方法来处理“混合”集合。
有什么帮助吗?请!
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]
scala - 在Scala中使用从Java类继承的方法
我正在尝试编译扩展 Java 类的 Scala 类文件。这是类定义,它是最基本的。在加载时,在宿主应用程序中,对象应该使用超类的方法 'post' 将“Hello from Scala”写入宿主的输出窗口。
这在应用程序中编译并运行良好。
这是我对 Scala 的翻译(老实说,我不是 100% 确定我完全理解 Scala 中的构造函数):
但是,当我尝试使用 scalac 进行编译时,我收到以下错误:
我不确定为什么编译器告诉我“post”不是成员函数,我确定我搞砸了 Scala 语法,但无法确定哪里出了问题。
谢谢!
编辑
这是 Max 窗口的输出,除了按如下规定更改代码外,我刚刚将 Scala 库添加到 Max 的动态加载路径中。这真让人兴奋