Scala:方法参数String *和Array [String]之间有区别吗

时间:2017-08-30 22:59:43

标签: scala

方法参数String*Array[String]之间是否存在差异?

控制台:

scala> def main(args: Array[String]): Unit = {}
main: (args: Array[String])Unit

scala> def main(args: String*): Unit = {}
main: (args: String*)Unit

代码1:

object Example {
  def main(args: Array[String]): Unit = {
    println("Hello")
  }
}

>> Hello

代码2:

object Example {
  def main(args: String*): Unit = {
    println("Hello")
  }
}

>> Exception in thread "main" java.lang.NoSuchMethodException: Example.main([Ljava.lang.String;)
    at java.lang.Class.getMethod(Class.java:1786)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:126)

2 个答案:

答案 0 :(得分:6)

是的,

String*是一个varargs,它接受任意数量的字符串,它将作为Seq[String]传递给方法。

Array[String]接受一个字符串数组。

如果您要将一系列字符串作为String*传递,则不能直接这样做,但您可以" splat"输出序列以使用:_*类型归属传递它。

def varArg(input: String*){}

val strings = Seq("hello", "world")
varArg(strings:_*)

答案 1 :(得分:2)

我去问the forum

您想要的注释是annotation.varargs

我有些暗示他们有这种胶水,但我没有理由使用它。

就个人而言,我宁愿自动采用main方法,b / c很明显。

$ scala
Welcome to Scala 2.12.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).
Type in expressions for evaluation. Or try :help.

scala> object Main { @annotation.varargs def main(args: String*) =
     | println(args.size)
     | }
defined object Main

scala> Main.main(Array("hello","world"): _*)
2

好的,很酷。