如何使用Java代码中的Scala varargs

有很多关于从Scala代码调用Java varargs的文章,但我唯一能找到相反的方法就是这个问题: 在java中使用scala vararg方法 ,它没有任何具体的例子。

我试图从一些Java代码中使用scala.Console ,因为java.io.Console在Eclipse中不起作用,而Scala则起作用。 但我无法得到这种方法

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

工作,因为它似乎期待第二个参数的scala.collection.Seq[Any] ,我不知道如何在Java中创建Seq 。 我该如何解决这个问题?

我尝试过的事情:

1)使用null

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

– 获得NullPointerException奖励。

2)用scala.collection.Seq.empty() )替换null ,但是javac会报告各种错误,例如Seq没有empty方法。

3)在scala.collection.immutable包对象中使用Nil对象,但这里建议的语法是scala.collection.immutable.package$Nil$.MODULE$ ,但是无法解析。

当然我可以使用不带varargs的readLine()方法,但这太容易了。

您可以使用:

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

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

 new scala.collection.mutable.ArrayBuffer(); 

创建一个空数组缓冲区,然后可以在其中添加元素并将其用作Scala vararg方法的参数。

否则,如果您使用vararg方法设计Scala库,并且要使用varargs注释,则使用vararg方法。 它将生成该方法的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[]), ...) 

reflection显示,生成的方法有两个版本 – 一个采用Seq[Int] ,另一个采用int[]