Scala Splat 内部工作



我知道在斯卡拉我可以说

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)):_*)

wrapIntArrayPredef中定义的隐式函数。

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

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

最新更新