Атрибут типа Scala для varargs, использующих _* причиной ошибки

У меня есть элементарное понимание Scara 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 = 

Вызов их напрямую с использованием 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))

Почему, когда я вызываю их, приписывая параметр _*Я получаю ошибки?

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:_*)
                      ^

1 ответ

method2 это не метод, принимающий повторяющиеся параметры, это функция с одним параметром типа Seq[String],

Вы должны назвать это так: method2(paramList) без :_*,

Там нет такого понятия, как function accepting repeated parameters в scala 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))

Обратите внимание на предполагаемый тип method2: Seq[String] => Unit в 2.10 против String* => Unit в 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) = ()
                           ^
Другие вопросы по тегам