使用_*的varargs的Scala类型归因导致错误

Han*_*xue 3 syntax types scala variadic-functions

我对Scala varargs有一个基本的了解:接受varargs的方法的参数需要暗示它是一个varargs使用_*.使用Scala 2.10.3,我定义了以下两种方法

scala> def method(varargs:Int*)(more:String*) = println(varargs,more)
method: (varargs: Int*)(more: String*)Unit
scala> val method2 = method(1,2,3)_
method2: Seq[String] => Unit = 
Run Code Online (Sandbox Code Playgroud)

使用List或Range直接调用它们可以正常工作

scala> val paramList = List("hi","ho")
paramList: List[java.lang.String] = List(hi, ho)

scala> method2(paramList)
(WrappedArray(1, 2, 3),List(hi, ho))

scala> val range = (1 to 5) map {_.toString}
range: scala.collection.immutable.IndexedSeq[String] = Vector(1, 2, 3, 4, 5)

scala> method2(range)
(WrappedArray(1, 2, 3),Vector(1, 2, 3, 4, 5))
Run Code Online (Sandbox Code Playgroud)

为什么当我通过归因于参数调用它们时_*,我得到错误?

scala> method2(paramList:_*)
<console>:11: error: type mismatch;
 found   : List[String]
 required: Seq[Seq[String]]
              method2(paramList:_*)
                      ^

scala> method2(range:_*)
<console>:11: error: type mismatch;
 found   : scala.collection.immutable.IndexedSeq[String]
 required: Seq[Seq[String]]
              method2(range:_*)
                      ^
Run Code Online (Sandbox Code Playgroud)

sen*_*nia 8

method2不是接受重复参数的方法,它是具有单个参数类型的函数Seq[String].

你应该这样称呼:method2(paramList)没有:_*.

有没有这样的东西function accepting repeated parametersscala 2.10,但它存在于scala 2.9:

scala> def method(varargs:Int*)(more:String*) = println(varargs,more)
method: (varargs: Int*)(more: String*)Unit

scala> val method2 = method(1,2,3)_
method2: String* => Unit = <function1>

scala> val paramList = List("hi","ho")
paramList: List[java.lang.String] = List(hi, ho)

scala> method2(paramList:_*)
(WrappedArray(1, 2, 3),List(hi, ho))
Run Code Online (Sandbox Code Playgroud)

请注意推断类型method2:Seq[String] => Unitin 2.10vs String* => Unitin 2.9.

它不是一个有用的功能:您不能将类型的变量String* => Unit用作参数或返回值.实际上String* => Unit即使在2.9以下情况下也不是有效类型:

scala> def test(f: String* => Unit) = ()
<console>:1: error: ')' expected but '=>' found.
       def test(f: String* => Unit) = ()
                           ^
Run Code Online (Sandbox Code Playgroud)