如何从 Java 代码中使用 Scala varargs

2022-09-02 13:05:46

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

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

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

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

我尝试过的事情:

1) 使用空值

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

- 获得奖励。NullPointerException

2) 将 替换为 ,但 javac 会报告各种错误,例如没有方法。nullscala.collection.Seq.empty()Seqempty

3) 使用包对象中的对象,但此处建议的语法是 ,但无法解决。Nilscala.collection.immutablescala.collection.immutable.package$Nil$.MODULE$

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


答案 1

您可以使用:

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

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

new scala.collection.mutable.ArrayBuffer();

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

否则,如果您使用要从Java代码中使用的vararg方法设计Scala库,则使用注释。它将生成该方法的Java版本,该方法采用数组而不是.varargsSeq

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 个版本的方法 - 一个采用 a,另一个采用 .fooSeq[Int]int[]


答案 2

推荐