Implicits-基础

《Programming in Scala 3rd》- Implicit Conversions And Parameters

主要解决的问题是扩展已有的对象。

隐式转换

每个库对实质上相同的概念有其各自不同的编码方式,隐式转换用于减少两种类型之间的显式转换操作。

隐式-规则

这些隐式定义是编译器允许的、被用于插入到程序中以用来解决类型错误问题。

  • 标记规则:只有那些被关键字implicit标记的定义
  • 作用域规则:被插入的隐式转换在作用域中必须是一个单独的标示符,或者是在被转换对象的伴生对象中。必须直接引入该隐式定义,而不是拥有该定义的对象。比如需要convert,它属于一个对象object,只有直接通过import object.convert才有效。需要的隐式定义在伴生对象中时则不需要显式引入。
  • 一次一个规则:只有一个隐式被插入。编译器永远不会将x + y重写为convert1(convert2(x)) + y
  • 显式优先规则:无论何时以代码编写的方式类型检查,都不会尝试隐式。编译器不会再去改变已经运行的代码。因此你可以随时使用显式定义替换隐式定义。

隐式转换到一个指定的类型

如果编译器看到一个 X,但是需要的是一个 Y,这时他会寻找隐式转换函数来将 X 转换为 Y。

隐式转换方法调用者

如果编译器看到如下代码obj.toInt,但是对象obj并不拥有toInt方法,这是会尝试查找拥有该方法的类型并尝试进行隐式转换。

与新类型互操作