Scala 高级特性之 隐式转换

引用 scala 官方的话, 只有两种情况会发生隐式转换:
  1. 当表达式类型 S 与期盼的类型 T 不相符时.
  2. 当对一个对象 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
    // 我们从前面定义处看到, buyTicket 需要接受的参数为 SpecialPerson , 
    // 但是此处传递的是 Student 对象, 因此调用了上面导入的隐式方法. 
    // 这就是第一种会调用到隐式转换的情况
    djh.buyTicket(djh)

    // 清晰的可以看到, Student 方法中并不存在 showSpecialTick 方法, 这就是所谓的隐式增强
    // 这就是第二种会调用到隐式转换的情况
    djh.showSpecialTick()

    // 这里是隐式参数.
    implicit val delimiter: Delimiter = Delimiter("<", ">")
    djh.showName()
  }
}
运行结果:
调用了隐试转换方法
djh-- implicit
调用了隐试转换方法
展示特殊身份票
<djh>

Process finished with exit code 0
从上面的运行结果可以看到, 每使用一次隐式转换,就会调用一次隐式转换方法.

说说隐式参数, 他是指一个以 implicit 标记的参数, scala 会自动在这个方法调用的作用域内搜索该隐式参数对应类型的 val var 变量, 或者在隐式参数类型的伴生对象中搜索隐式变量. 当然,也可以手动传入隐式参数.

参考: Scala 的隐式转换、隐式参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值