Scala Splat内部加工
我知道在scala我可以说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
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
至于为什么后一个(没有类型注释)不被接受,我猜这只是一个设计选择,不让开发人员困惑它是如何工作的:)。中讨论了
.*
构造。没有提到隐式转换。此外,只有一个.*
引用,在其中使用,未定义。我怀疑它只是融入了语言,有点像一个关键词。