Scala Splat内部加工

Scala Splat内部加工,scala,splat,Scala,Splat,我知道在scala我可以说 def foo(x: Int*) ... foo(Seq(1,2,3): _*) 但我不能说 foo(Seq(1,2,3)) 所以一定有一些隐含的转换在进行。这种隐式转换是什么?是什么实际的方法使这种情况发生的。或者,如果我错了,它实际上是如何工作的?当您将Seq与类型注释.*一起使用时,没有隐式转换,因为重复的参数基本上已经是Seq 但是,如果使用了数组,则会有一个隐式转换,并且 foo(Array(1,2,3): _*) 会是 foo(wrapIntArr

我知道在scala我可以说

def foo(x: Int*) ...

foo(Seq(1,2,3): _*)
但我不能说

foo(Seq(1,2,3))

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

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

但是,如果使用了
数组
,则会有一个隐式转换,并且

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

foo(wrapIntArray(Array(1,2,3)):_*)
wrapIntArray
是在
Predef
中定义的隐式函数

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

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

中讨论了
.*
构造。没有提到隐式转换。此外,只有一个
.*
引用,在其中使用,未定义。我怀疑它只是融入了语言,有点像一个关键词。