如何使用Java代码中的Scala varargs

时间:2012-04-08 04:27:56

标签: java scala console scala-java-interop

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

我正在尝试使用某些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)将null替换为scala.collection.Seq.empty(),但javac会报告各种错误,例如Seq没有empty方法。

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

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

1 个答案:

答案 0 :(得分:24)

您可以使用:

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

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

new scala.collection.mutable.ArrayBuffer();

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

否则,如果您使用vararg方法设计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[]), ...)

上图中,反射显示已生成方法foo的2个版本 - 一个采用Seq[Int]而另一个采用int[]