从java使用scala.collection.immutable.Set的示例

Jas*_*n S 8 java scala data-structures

那些熟悉Scala的人是否知道如何使用Java中的scala.collection.immutable.Set?我可以模糊地阅读scaladoc,但我不确定如何从java调用scala方法如" - "(我假设我只需要在我的类路径中包含一些scala .jar文件......?)

Ada*_*ung 8

Scala将这些特殊符号写为$ plus,$ minus等.您可以通过对scala.collection.immutable.HashSet运行javap来自行查看.

这允许你做这样的代码:

Set s = new HashSet<String>();
s.$plus("one");
Run Code Online (Sandbox Code Playgroud)

不漂亮,它实际上并没有在运行时工作!你得到一个NoSuchMethodError.我猜这与这次讨论有关.使用他们讨论的解决方法,您可以使事情有效:

import scala.collection.generic.Addable;
import scala.collection.generic.Subtractable;
import scala.collection.immutable.HashSet;
import scala.collection.immutable.Set;

public class Test {
    public static void main(String[] args) {
        Set s = new HashSet<String>();
        s = (Set<String>) ((Addable) s).$plus("GAH!");
        s = (Set<String>) ((Addable) s).$plus("YIKES!");
        s = (Set<String>) ((Subtractable) s).$minus("GAH!");
        System.out.println(s); // prints Set(YIKES!)
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是一个美女!?

我相信Java 7将允许转义时髦的方法名称,所以也许到那时你就可以做到

s = s.#"-"('GAH!')
Run Code Online (Sandbox Code Playgroud)

要尝试此操作,您需要Scala发行版的lib /文件夹中的scala-library.jar.

更新:修复了Java 7语法,感谢Mirko.

  • 不幸的是,Java 7用于调用外来名称的语法(http://bugs.sun.com/view_bug.do?bug_id=6746458)并不那么漂亮:s = s.#" - "('GAH!') (2认同)