Lui*_*hys 19 java console scala scala-java-interop
有很多关于从Scala代码调用Java varargs的文章,但我唯一能找到相反的方法就是这个问题:在java中使用scala vararg方法,它没有任何具体的例子.
我试图使用scala.Console一些Java代码,因为它java.io.Console在Eclipse中不起作用,而Scala则起作用.但我无法得到这种方法
def readLine (text: String, args: Any*): String
Run Code Online (Sandbox Code Playgroud)
工作,因为它似乎期待scala.collection.Seq[Any]第二个参数,我不知道如何Seq在Java中创建 .我该如何解决这个问题?
我试过的事情:
1)使用null
// Java
String s = scala.Console.readLine("Enter text: ", null);
Run Code Online (Sandbox Code Playgroud)
- 获得奖励NullPointerException.
2)替换nullwith scala.collection.Seq.empty(),但javac会报告各种错误,例如Seq没有empty方法.
3)Nil在scala.collection.immutable包对象中使用对象,但是这里建议的语法是scala.collection.immutable.package$Nil$.MODULE$,但是无法解决.
当然我可以使用readLine()不采用varargs 的方法,但这太容易了.
axe*_*l22 24
您可以使用:
scala.collection.Seq$.MODULE$.empty();
Run Code Online (Sandbox Code Playgroud)
从Java代码创建一个空序列.否则,您可以使用:
new scala.collection.mutable.ArrayBuffer();
Run Code Online (Sandbox Code Playgroud)
创建一个空数组缓冲区,然后可以在其中添加元素并将其用作Scala vararg方法的参数.
否则,如果您使用vararg方法设计Scala库,并希望使用该代码,则使用varargs注释.它将生成一个Java版本的方法,它采用数组而不是a 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[]), ...)
Run Code Online (Sandbox Code Playgroud)
在上面,反射显示有两个版本的方法foo生成 - 一个采用a Seq[Int]和另一个采用a int[].