2012-04-08 84 views
19

从Scala代码中调用Java可变参数值有很多文章,但唯一能找到相反方向的是这个问题:Using scala vararg methods in java,它没有任何具体的例子。如何从Java代码中使用Scala可变参数

我试图从某些Java代码中使用scala.Console,因为java.io.Console在Eclipse中不起作用,而Scala却不起作用。但我不能让

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

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

事情我已经尝试:

1)使用空

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

- 得到了NullPointerException奖励。

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

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

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

回答

24

您可以使用:

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

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

new scala.collection.mutable.ArrayBuffer(); 

创建一个空的阵列缓冲器,可以在其中再加入元素,并且使用它作为参数传递给Scala的可变参数的方法。否则,如果您设计了一个Scala库,其中包含要从Java代码使用的可变参数方法,则使用varargs批注。它将生成一个采用数组而不是Seq的Java版本的方法。

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[]

+1

我编辑了答案。 – axel22 2012-04-08 12:09:42

+0

太好了,那有效。两者仍然在Eclipse中显示错误,但它们确实进行了编译。这可能是问题的一部分。 – 2012-04-08 12:30:16

相关问题