我知道在斯卡拉我可以说
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
至于为什么后者(没有类型注释(不被接受,我猜这只是一个设计选择,不要让开发人员困惑它是如何工作的:)。