您的位置:首页 > 其它

Scala隐式转换和隐式参数

2017-11-15 18:46 337 查看

隐式转换和隐式参数

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把隐式转换导入。简单来说,隐式代码应该可以被”直接”使用,不能再依赖类路径。

假如我们把隐式转换定义在源类型或者目标类型的伴生对象内,则我们可以跳过单一标示符的规则。因为编译器在编译期间会自动搜索源类型和目标类型的伴生对象,以尝试找到合适的隐式转换。

参考

implicit conversions and parameters

implicits intro

Scala中的Implicit详解

Scala 隐式转换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: