Подтвердить что ты не робот

Каков тип списка аргументов переменной длины в Scala?

Предположим, что я объявляю функцию следующим образом:

def test(args: String*) = args mkString

Каков тип args?

4b9b3361

Ответ 1

Это называется переменным числом аргументов или короткими varargs. Статический тип Seq[T], где T представляет T*. Поскольку Seq[T] - это интерфейс, он не может использоваться как реализация, которая в этом случае scala.collection.mutable.WrappedArray[T]. Чтобы узнать о таких вещах, полезно использовать REPL:

// static type
scala> def test(args: String*) = args
test: (args: String*)Seq[String]

// runtime type
scala> def test(args: String*) = args.getClass.getName
test: (args: String*)String

scala> test("")
res2: String = scala.collection.mutable.WrappedArray$ofRef

Varargs часто используются в сочетании с символом _*, который является подсказкой для компилятора передать элементы Seq[T] в функцию вместо самой последовательности:

scala> def test[T](seq: T*) = seq
test: [T](seq: T*)Seq[T]

// result contains the sequence
scala> test(Seq(1,2,3))
res3: Seq[Seq[Int]] = WrappedArray(List(1, 2, 3))

// result contains elements of the sequence
scala> test(Seq(1,2,3): _*)
res4: Seq[Int] = List(1, 2, 3)