Scala Splat 内部工作原理

Scala Splat inner workings

我知道在 scala 中我可以说

def foo(x: Int*) ...

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

但我不能说

foo(Seq(1,2,3))

所以必须进行一些隐式转换。这个隐式转换是什么?使这种情况发生的实际方法是什么。或者,如果我错了,它实际上是如何工作的?

当您将 Seq 与类型注释 _* 一起使用时,没有隐式转换,因为重复的参数基本上已经是 Seq

但是,如果你使用Array,那么就会有一个隐式转换,而

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

会是

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

wrapIntArray是在Predef.

中定义的隐式函数
implicit def wrapIntArray(xs: Array[Int]): ArraySeq.ofInt

至于为什么后一个(没有类型注释)不被接受,我猜这只是一种设计选择,而不是让开发人员对它的工作原理感到困惑:)。