如何使用Java代码中的Scala varargs

有很多关于从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)用scala.collection.Seq.empty()替换null,但javac报告各种错误,如Seq没有空的方法。

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

当然,我可以使用不使用varargs的readLine()方法,但这样做太简单了。

您可以使用:

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

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

new scala.collection.mutable.ArrayBuffer();

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

否则,如果您使用要从Java代码使用的vararg方法设计Scala库,则使用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生成 – 一个采用Seq [Int],另一个使用int []。

http://stackoverflow.com/questions/10060377/how-to-use-scala-varargs-from-java-code

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何使用Java代码中的Scala varargs