隐式转换和隐式参数
Scala在面对编译出现类型错误时,提供了一个由编译器自我修复的机制,编译器试图去寻找一个隐式implicit的转换方法,转换出正确的类型,完成编译
优点使代码简洁,但可读性差
val num: Int = 3.5 // Compile Error
// 如果在上面加一个隐式转换方法之后,就没问题了
implicit def double2Int(d: Double) = d.toInt
val num: Int = 3.5 // 这段代码会被编译成 val num: Int = double2Int(3.5)
- 主要两种功能
- 实现变量类型的转换,叫隐式转换
- 补充curring函数的调用列表,叫隐式参数
语法
- 声明隐式转换函数
// implicit def 方法名(x: 类型) = 转换之后的类型 implicit def intToString(x: Int) = x.toString
- 声明隐式转换函数
遵守原则
- 一次编译只隐式转换一次(One-at-a-time Rule)
- Scala不会把 x + y 转换成 convert1(convert2(x)) + y
- 在作用域范围内单一标识符
- 单一标示符是说当隐式转换作用时应该是这样的形式:file2Array(arg).map(fn)的形式,而不是foo.file2Array(arg).map的形式。假设file2Array函数定义在foo对象中,我们应该通过import foo._或者import foo.file2Array把隐式转换导入。简单来说,隐式代码应该可以被”直接”使用,不能再依赖类路径。
假如我们把隐式转换定义在源类型或者目标类型的伴生对象内,则我们可以跳过单一标示符的规则。因为编译器在编译期间会自动搜索源类型和目标类型的伴生对象,以尝试找到合适的隐式转换。
- 一次编译只隐式转换一次(One-at-a-time Rule)