有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用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没有empty方法

3)在scala.collection.immutable包对象中使用Nil对象,但语法建议使用here,即scala.collection.immutable.package$Nil$.MODULE$,但无法解决

当然,我可以使用不接受varargs的readLine()方法,但那太简单了


共 (1) 个答案

  1. # 1 楼答案

    您可以使用:

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