引用 scala 官方的话, 只有两种情况会发生隐式转换:
- 当表达式类型 S 与期盼的类型 T 不相符时.
- 当对一个对象 b 调用 b.methodA() 时, methodA 并不存在于 b 对象所属的类或父类中时.
下面用代码说明什么是隐式转换:
class SpecialPerson(val name: String) {
def showSpecialTick(): Unit = {
println("展示特殊身份票")
}
}
class Student(val name: String) {
implicit def student2SpecialPerson(student: Student): SpecialPerson = {
println("调用了隐试转换方法")
new SpecialPerson(name + "-- implicit")
}
def buyTicket(specialPerson: SpecialPerson): Unit = {
println(specialPerson.name)
}
def showName()(implicit delimiter: Delimiter): Unit = {
println(s"${delimiter.left}$name${delimiter.right}")
}
}
case class Delimiter(left: String, right: String)
下面看看调用:
object Demo {
def main(args: Array[String]): Unit = {
val djh = new Student("djh")
import djh.student2SpecialPerson
djh.buyTicket(djh)
djh.showSpecialTick()
implicit val delimiter: Delimiter = Delimiter("<", ">")
djh.showName()
}
}
运行结果:
调用了隐试转换方法
djh-- implicit
调用了隐试转换方法
展示特殊身份票
<djh>
Process finished with exit code 0
从上面的运行结果可以看到, 每使用一次隐式转换,就会调用一次隐式转换方法.
说说隐式参数, 他是指一个以 implicit 标记的参数, scala 会自动在这个方法调用的作用域内搜索该隐式参数对应类型的 val var 变量, 或者在隐式参数类型的伴生对象中搜索隐式变量. 当然,也可以手动传入隐式参数.