【问题标题】:How to use Scala varargs from Java code如何在 Java 代码中使用 Scala 可变参数
【发布时间】:2012-04-21 01:38:51
【问题描述】:

有很多关于从 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) 在scala.collection.immutable 包对象中使用Nil 对象,但语法建议here,即scala.collection.immutable.package$Nil$.MODULE$,但无法解析。

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

【问题讨论】:

    标签: java scala console scala-java-interop


    【解决方案1】:

    你可以使用:

    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 - 一个采用Seq[Int],另一个采用int[]

    【讨论】:

    • 太好了,这行得通。两者在 Eclipse 中仍然显示错误,但它们确实可以编译。这可能是问题的一部分。
    猜你喜欢
    • 2016-01-15
    • 2019-12-26
    • 2010-11-03
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多