Scala隐式转换和隐式参数

来源:互联网 发布:大数据在社保行业应用 编辑:程序博客网 时间:2024/05/20 01:35

隐式转换和隐式参数

Scala在面对编译出现类型错误时,提供了一个由编译器自我修复的机制,编译器试图去寻找一个隐式implicit的转换方法,转换出正确的类型,完成编译

优点使代码简洁,但可读性差

val num: Int = 3.5 // Compile Error// 如果在上面加一个隐式转换方法之后,就没问题了implicit def double2Int(d: Double) = d.toIntval 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 隐式转换
原创粉丝点击