Scala中Array[Int]隐式转换为Int=>Int的逻辑定义位置在哪?
隐式转换的定义位置
这个隐式转换定义在 Scala 标准库的 scala.Predef 对象中,Predef 是 Scala 代码默认全局自动导入的对象,不需要手动引入。对应处理 Array[Int] 的隐式方法为 wrapIntArray,其他基础类型数组也有对应的 wrapXxxArray 同名系列方法,泛型数组对应 wrapRefArray 方法。
转换生效原理
wrapIntArray核心签名为:implicit def wrapIntArray(xs: Array[Int]): scala.collection.mutable.ArraySeq[Int],在 Scala 2.12 及更早版本中返回值类型为WrappedArray[Int],这也是你赋值后打印函数变量能看到WrappedArray(1, 2, 3)输出的原因。- Scala 中所有序列(Seq)类型都继承了
PartialFunction[Int, T]特质,而PartialFunction本身又是Function1[Int, T]的子类型,因此ArraySeq[Int]/WrappedArray[Int]天然符合Int => Int的函数类型签名,编译器在类型检查阶段发现类型不匹配时,就会自动应用这个预定义的隐式转换完成赋值。 - 反向没有预设
Int => Int转Array[Int]的隐式转换,因此赋值会直接报类型不匹配错误。
你可以通过给 scalac 添加 -Xprint:typer 编译参数查看完整的类型检查后代码,就能看到编译器在赋值语句中自动插入了 Predef.wrapIntArray(arr) 的转换调用。
内容的提问来源于stack exchange,提问作者Han
相关产品推荐
相关产品推荐

