19

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

我正在尝试使用scala.Console一些 Java 代码,因为它java.io.Console在 Eclipse 中不起作用,而 Scala 则可以。但我无法获得方法

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) 替换了nullwith scala.collection.Seq.empty(),但是 javac 报各种错误,比如Seq没有empty方法。

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

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

4

1 回答 1

25

您可以使用:

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[]), ...)

上面,反射显示foo生成了 2 个版本的方法 - 一个采用 a Seq[Int],另一个采用int[].

于 2012-04-08T08:27:53.223 回答