问题标签 [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 投票
3 回答
11145 浏览

java - 我可以直接在 Java 中使用 scala List 吗?

我可以在 Java 中使用 scala List,例如:

它似乎没有编译。找不到 List$.apply 方法。

当我将其更改为

其中 Dir 是我的 scala 类,并且 ls() 返回一个 scala 列表,编译器抱怨

“内部编译器错误:java.lang.ClassCastException:org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding 无法在 org.eclipse.jdt.internal 中转换为 org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding。 compiler.lookup.BinaryTypeBinding.initializeTypeVariable(BinaryTypeBinding.java:927)"

我不知道这意味着什么。


我想在 scala 中编写一些库,但也希望它可以在 Java 中使用。

在我的 scala 类中有返回 scala 列表的方法,对于使用它们的 java 代码,我有两个选择:

  1. 直接在java中使用scala List

  2. 编写一个为这些方法返回 java.util.List 的包装类。

我更喜欢选项 1,否则我将不得不为几乎所有的 scala 类编写一个包装类。

但我就是无法让 scala List 在 Java 中运行。

0 投票
1 回答
611 浏览

scala - Return a Java collection of type and subclasses from Scala

I have an interface in Java that looks something like this:

I need to implement this interface in Scala 2.8 and currently I'm doing something like this:

But this does not compile and the compiler says:

Any idea how to get around this issue?

UPDATE:

I've tried the following but still no luck:

In this latter case I get:

0 投票
3 回答
6797 浏览

scala - 使用 Scala 中的 java.util.Map

我需要通过以下方法使用 java-legacy 代码:

我的斯卡拉代码:

产量 =>

类型不匹配; 找到:java.util.HashMap[String, Any] 需要:java.util.HashMap[java.lang.String, java.Object]

所以我把它改成:

产量 =>

类型不匹配; found : Char required: java.lang.Object 注意:原始类型不会隐式转换为 AnyRef。您可以通过强制转换 x.asInstanceOf[AnyRef] 来安全地强制装箱。

所以最后我想出了以下几点:

有没有更简洁的方法来处理这个问题?

0 投票
4 回答
669 浏览

scala - 如何存储对 Scala 中一组静态 Java 方法的引用?

在 Eclipse 数据绑定的上下文中,有很多 Java 类充当IObservable对象的工厂。例如,有BeanObservables, PojoObservables,EMFObservables等,它们都实现了一组类似的方法

现在,如果我们在 Scala 世界中,这些工厂中的每一个都可能是实现一个共同特征的单例对象,例如,IObservableFactory我可以将它们作为隐式值传递给使用它们来创建数据绑定的方法.

但是由于它们是用 Java 定义的,所以我似乎什么都做不了。我不能写

因为PojoObservables不被认为是一个值。

有没有办法让编译器“实例化”一个与PojoObservablesScala 中的类相对应的单例?或者有什么解决方法?我知道我可以自己编写单例并转发所有方法调用,但这听起来有点乏味。


编辑

为了更清楚:这就是我想要做的:定义一个使用传递的工厂创建可观察值的方法。

但我不知道如何定义ObservableFactory或如何实际将PojoObservables只有静态方法的 Java 类传递给该createObservable方法。

0 投票
2 回答
2463 浏览

scala - 在 Scala 中,如何为 Java 中定义的类定义伴随对象?

我想向建模工具生成的 Java 类添加隐式转换。所以我想将它们添加到这些类的伴随对象中,以便编译器自动找到它们。但我不能将它们添加到单独的文件中,因为必须在同一个文件中定义伴侣。对此我能做些什么吗?

当然,我可以在另一个对象中定义所有隐式转换,然后将其带入范围,但这需要额外的导入。还有其他解决方案吗?

0 投票
2 回答
1250 浏览

scala - 当类层次结构中有原始类型时,为什么 Scala 会抱怨非法继承?

我正在编写一个包装器,它采用 Scala并触发与Eclipse/JFace 数据绑定框架ObservableBuffer兼容的事件。

在 Databinding 框架中,有一个抽象ObservableList来装饰一个普通的 Java 列表。我想重用这个基类,但即使是这个简单的代码也失败了:

有错误:

为什么?它与原始类型有关吗?ObservableListimplements IObservableList,它扩展了原始类型java.util.List。这是预期的行为,我该如何解决?

0 投票
2 回答
1477 浏览

scala - 如何摆脱这种类型的警告/错误?

我有一个脚本。它在没有警告的情况下运行。

我想将循环提取到它自己的函数中。所以我试试。

循环在它自己的函数中意味着它需要更具体的类型。好的。

我会尝试使用java.util.Map [AnyRef, AnyRef]而不是java.util.Map [_, _].

所以现在它运行了,但它给了我一个警告。如何消除该警告?

笔记:

  1. org.yaml.snakeyaml.Yaml 是用 Java 编写的,所以我不能使用类型清单。(我可以吗?)
  2. 我的真实程序使用了几个 Java 库,所以当我对给出的类型做出可能的错误假设时,我希望得到警告。但是我如何告诉编译器“是的,我已经检查过了,它是正确的,不要再警告我了”?
  3. 我正在使用 scala 2.7.7(因为这是与 Ubuntu 一起打包的版本)。
0 投票
2 回答
735 浏览

generics - 两个耦合的 Scala 泛型类型构造函数如何将彼此称为类型参数?

在 Java 1.6.0_21 中,下面的第一个示例编译得很好,我认为这是因为参数类型边界是裸露的。也就是说,在下面的“Z extends Zen”界限中,Java 允许 Zen 作为原始非泛型类型的名称(相当于运行时“已擦除”类型)滑动。这可能是错误的和不好的,但它也可能是有用的,或者至少是在回家的公共汽车上的古怪美好时光:

在 Scala 2.8.0.final 中,下面通过 CleanOceanWithFish 编译得很好,显示了一些基本的类型参数连接。但是当我们发现 Zen 和 Tao 是相互依赖的泛型类型时,Scala 编译器会拒绝我的编织构造。请参阅注释中的编译器错误。

那么,我怎样才能在道和禅之间正确地打结 Scala (2.8.0) 结呢?

这当然是一个人为的例子,但我真正想要的是使用 Scala 来扩展我以上述形式工作的一些真正的 Java 类型(到目前为止,通过“forSome”和“[_]”的存在类型对我没有帮助)。我认为在 Scala 中编译 Zen 和 Tao 可能会为 Java 扩展指明方向。如果您可以在答案中考虑 Java 扩展问题,那就更好了。谢谢你的帮助!

在 Nikita S. 和 Kris N. 以下非常有用的前两个答案之后发布的更新。

我凭经验学到了更多关于各种 Java+Scala 共指场景的知识。结果是,当我们想要 Java 和 Scala 中的可互操作的共同引用类型时那么这个 Java 构造:

提供比我在顶部的第一个 Java 示例更具体的类型(避免原始类型),然后可以在 Scala 中正确扩展,如下所示:

我验证了我们可以基于这些创建简单的具体类型,实例化它们,并调用它们的方法。Java 和 Scala 中的关键步骤是将有界通配符放置在类型参数树循环回当前声明类型的位置,即 java 中的“? extends”和 Scala 中的“_ <:”。

0 投票
2 回答
630 浏览

scala - Scala-Java 不兼容引用与静态内部类同名的类中的静态字段

学习这个 Java 类:

此 Java 代码有效:

但从 Scala 调用它:

导致编译器错误:

任何人都知道解决这个问题的方法,还是我必须重命名我的静态字段?

——安德烈亚斯

0 投票
2 回答
21791 浏览

scala - 从 java.lang.Iterator 创建一个不可变列表

我正在使用库 ( JXPath ) 来查询 bean 图以提取匹配元素。但是,JXPath 将匹配元素组作为 java.lang.Iterator 的实例返回,我宁愿将其转换为不可变的 scala 列表。有没有比迭代迭代器并在每个迭代步骤创建一个新的不可变列表更简单的方法?