Scala Splat внутренние работы

я знаю в scala я могу сказать

def foo(x: Int*) ...

foo(Seq(1,2,3): _*)

Но я не могу сказать

foo(Seq(1,2,3))

Поэтому должно происходить какое-то неявное преобразование. Что это за неявное преобразование? Каков фактический метод, который делает это возможным. Или, если я ошибаюсь, как это на самом деле работает?


person munk    schedule 22.08.2019    source источник
comment
Конструкция _* обсуждается в разделе 4.6. .3 спецификации языка. Там нет упоминания о неявном преобразовании. Кроме того, predef исходный код имеет только одну ссылку _*, где она используется, не определена. Я подозреваю, что это просто встроено в язык, вроде ключевого слова.   -  person jwvh    schedule 23.08.2019


Ответы (1)


При использовании Seq с аннотацией типа _* неявного преобразования не происходит, потому что повторяющийся параметр в основном уже является Seq.

Однако, если бы вы использовали Array, то было бы неявное преобразование, и

foo(Array(1,2,3): _*)

было бы

foo(wrapIntArray(Array(1,2,3)):_*)

wrapIntArray — это неявная функция, определенная в Predef.

implicit def wrapIntArray(xs: Array[Int]): ArraySeq.ofInt

Что касается того, почему последний (без аннотации типа) не принимается, я предполагаю, что это просто выбор дизайна, чтобы не озадачивать разработчика тем, как это работает :).

person Feyyaz    schedule 22.08.2019