如何使用Scala的Java代码可变参数(How to use Scala varargs from

2019-06-23 11:39发布

有大量的文章对从调用Scala代码的Java可变参数,但我能找到相反的方式轮的唯一的事情就是这样一个问题: 在Java中使用Scala的可变参数的方法 ,它没有任何具体的例子。

我试图用scala.Console从一些Java代码,其中的原因java.io.Console并不在Eclipse中工作,而斯卡拉人做。 但我不能获得方法

def readLine (text: String, args: Any*): String

工作,因为它似乎是期待scala.collection.Seq[Any]对于第二个参数,我看不出如何创建一个Seq中的Java。 我怎样才能解决此问题?

事情我已经尝试:

1)使用空

// Java
String s = scala.Console.readLine("Enter text: ", null);

-获得奖励与NullPointerException

2)更换nullscala.collection.Seq.empty()但报道的javac各种错误的如Seq不具有empty方法。

3)使用Nil对象中的scala.collection.immutable包对象,但语法建议在这里 ,这将是scala.collection.immutable.package$Nil$.MODULE$ ,但不能得到解决。

当然,我可以只使用readLine()不带可变参数的方法,但是这将是太容易了。

Answer 1:

您可以使用:

scala.collection.Seq$.MODULE$.empty();

从Java代码创建一个空的序列。 否则,你可以使用:

new scala.collection.mutable.ArrayBuffer();

创建一个空的阵列缓冲器,可以在其中再加入元素,并且使用它作为参数传递给Scala的可变参数的方法。

否则,如果你设计一个Scala库与你想从Java代码中使用可变参数的方法,然后使用varargs的注释。 它会产生这需要的阵列,而不是一个的方法的一个Java版本Seq

scala> class A {
     |   @annotation.varargs def foo(x: Int*) { println(x) }
     | }
defined class A

scala> println(classOf[A].getMethods.toList)
List(public void $line1.$read$$iw$$iw$A.foo(scala.collection.Seq), public void $line1.$read$$iw$$iw$A.foo(int[]), ...)

以上,反射显示,有2个版本的方法foo产生-一个采用一个Seq[Int]和另一它接受一个int[]



文章来源: How to use Scala varargs from Java code