Scala中int2double隐式转换无需导入仍生效的原因是什么?
为什么Scala 2.10+中Int转Double的隐式转换无需导入?
先看示例代码:
scala> val d: Double = 2 d: Double = 2.0
这段代码能生效是因为int2double这个隐式转换在起作用。在Scala 2.10之前,这个转换定义在Predef对象里,而Predef会被自动导入到所有Scala代码的作用域中,所以不用手动导入就能用。
但2.10之后,int2double被移到了Int的伴生对象里,却依然不用导入就能生效,核心原因是Scala编译器的隐式查找规则:
- 当编译器需要为某个类型(这里是
Int)寻找适配目标类型(Double)的隐式转换时,会自动搜索该源类型的伴生对象中的隐式成员。 Int的伴生对象属于Int类型的“关联作用域”,编译器会默认扫描这个范围,不需要开发者手动导入伴生对象里的转换方法。
简单来说,只要是定义在某个类型伴生对象里的隐式转换,当处理该类型的转换场景时,编译器会自动找到它,不用额外写import Int._之类的语句。
内容的提问来源于stack exchange,提问作者Rupam Bhattacharjee
相关产品推荐
相关产品推荐

