Scala: 方法参数String*和Array[String]有什么区别?

3

方法参数 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)

1
可能是如何将Scala数组传递给Scala可变参数方法?的重复问题。 - prayagupa
2个回答

7
是的,String* 是一个可变参数,可以传入任意数量的字符串,这些字符串将作为 Seq[String] 传递给方法。 Array[String] 接受单个字符串数组。
如果您有一个要作为 String* 传递的字符串序列,您无法直接这样做,但您可以使用 :_* 类型说明符展开序列并将其传递。
def varArg(input: String*){}

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

那么 String* 是一种类型还是只是在控制台中表达可变参数的方式?我如何在控制台中看到它作为 Seq[String] 传递给方法?附注:这个旧答案说它作为数组传递,它在某个时候改变成 Seq 了吗?https://dev59.com/bHM_5IYBdhLWcg3wTRLL#1438796 - rapt
@rapt 我认为它是一种类型,但我不确定。无论如何,它只能用作方法参数。来自该问题的更受欢迎和详细的答案形式还提到了它是一个Seq。您也可以通过定义一个varargs方法并查看您得到的内容来找出自己的答案。def test(args: String*) = args。我们看到它返回一个Seq[String],具体实现取决于传入参数时的情况,如果我们传入参数,则具体实现是WrappedArray,但如果我们不传入参数,则是Nil(空列表,即List())。 - puhlen
我为那个错误下投了链接答案的踩;Java使用数组,Scala使用Seq。重复的参数具有Seq类型,http://scala-lang.org/files/archive/spec/2.12/04-basic-declarations-and-definitions.html#repeated-parameters。Vararg本身是编译器内部的一种类型,但我们通常看不到它。 - som-snytt
如果编译器能够为可变参数主函数建立桥接,那就太棒了,我不知道他们为什么不这样做。值得补充的是,这就是 App 的作用。 - som-snytt

2
我去论坛上询问了。
你想要的注释是annotation.varargs
我有点感觉他们有那种胶水,但我从来没有用过它的理由。
个人而言,我更希望main方法自动完成,因为这很明显。
$ 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

好的,很酷。

可能是我在SO上的最后一次发言。 - som-snytt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接