scala运算符作为java中的方法

mut*_*nUp 5 java eclipse scala scala-java-interop scala-collections

在操作scala对象(主要来自scala.collection包)时,操作符重载函数似乎可用于Java.

即斯卡拉

var s = Set(1, 2, 3)
var t = s + 4
var x = s | t
Run Code Online (Sandbox Code Playgroud)

所以在Java中,查看scala.collection.Seteclipse自动完成,我可以看到原型

eclipse截图

但是我无法正确使用它们

import scala.collection.Set;

Set<Integer> s = new Set<Integer>();
Set<Integer> t = s.$plus(4); /* compile error with javac, or runtime error with eclipse/*
Run Code Online (Sandbox Code Playgroud)

这些scala方法如何在Java中使用?

mut*_*nUp 1

看来您无法用 Java 编写某些 scala 接口!
该代码可以在 Sun 和 Eclipse 中正确编译和执行。

HashSet注意作业左侧的使用

import scala.collection.HashSet;

public class TestCase1 {

    public static void main(String[] args) {
        HashSet<String> set2 = new HashSet<String>();

        HashSet<String> set4 = set2.$plus("test");

        System.out.println(set2.size());
        System.out.println(set4.size());


    }
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?

我相信这与 Scala 继承多个特征的能力有关,这是 java eclipse 不理解的。

例如,HashSet 扩展了AbstractSet, Set, GenericSetTemplate,SetLike, FlatHashTable, CustomParallelizable, Serializable一些接口,其中一些是抽象类。

.$plus()方法似乎来自SetLike,而不是Set,这可以解释为什么在超类型上调用该方法Set会导致此错误。

也就是说,我仍然不能指HashSet使用 Supertype SetLike,因为它仍然失败,这就是我能做的。

我认为这里的主要问题是 Elipse 以某种方式错误地将超类型描述为具有这些方法,这是错误的。