从Java

时间:2015-12-29 20:18:31

标签: java scala collections

关于这个问题实际上还有另一个问题:

example of using scala.collection.immutable.Set from java

但信息似乎不再正确。

我尝试使用不可变的Scala集:

class Foo {
  public static void main(String[] args) {
    scala.collection.Set<Integer> mySet = 
      new scala.collection.immutable.Set.Set1<Integer>(1);
    mySet = mySet.$plus(3);
  } 
}

但是,在运行时,这会失败:

Exception in thread "main" java.lang.NoSuchMethodError: scala.collection.Set.$plus(Ljava/lang/Object;)Lscala/collection/SetLike;
    at Foo.main(Foo.java:4)

之前关于StackOverflow的讨论意味着此问题的解决方案是使用Addable trait。但是,它被删除了几个版本。实际上还有StackOverlow对此的讨论

Why is Scala's Addable deprecated?

然而,那里使用+:或:+的建议对我没有帮助,因为无序的集合没有这些方法。

可以使用SetLike特征,但它只会更改错误消息

Exception in thread "main" java.lang.NoSuchMethodError: scala.collection.SetLike.$plus(Ljava/lang/Object;)Lscala/collection/SetLike;
at Foo.main(Foo.java:4)

以防万一:

% scala -version
Scala code runner version 2.11.6 -- Copyright 2002-2013, LAMP/EPFL

% java -version   
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

1 个答案:

答案 0 :(得分:2)

GenSet似乎是你正在寻找的特质:

class Foo {
  public static void main(String[] args) {
    scala.collection.GenSet<Integer> mySet =
      scala.collection.Set$.MODULE$.<Integer>empty();
    mySet = mySet.$plus(3);
  }
}

class Foo {
  public static void main(String[] args) {
    scala.collection.GenSet<Integer> mySet =
            new scala.collection.immutable.Set.Set1<Integer>(1);
    mySet = mySet.$plus(3);
  }
}