scala隐式转换函数

定义:
1.只要在程序可见的范围内定义了隐式转换函数,就会被scala自动调用
2.隐式转换函数的名字可以任意,建议名为”xxx2yyy”
3.以implicit开头,而且最好定义函数返回类型
eg:

object Test{
   def main(args:Array[String]): Unit ={
      class Student(val name: String)
    class Older(val name: String)
    class SpecialPerson(val name: String)

    implicit def object2SpecialPerson (obj: Object): SpecialPerson = {
      if (obj.getClass == classOf[Student]) {
        val stu = obj.asInstanceOf[Student];
        new SpecialPerson(stu.name)
      }
      else if (obj.getClass == classOf[Older]) {
        val older = obj.asInstanceOf[Older]
        new SpecialPerson(older.name)
      }
      else null
    }

    var ticketNumber = 0
    def buySpecialTicket(p: SpecialPerson) = {
      ticketNumber += 1
      "T-" + ticketNumber
    }

    val a=new Student("aaa")
    println(buySpecialTicket(a))
    val b=new Older("bbb")
    println(buySpecialTicket(b))
   }
}

** 隐式转换的强大之处就是可以在不知不觉中增强现有类的功能
** 如果隐式转换函数不在可见范围内,那就必须使用import来导入,如:importxxx._

class Man(val name: String)
class Superman(val name: String) {
  def emitLaser = println("emit a laster!")
}

implicit def man2superman(man: Man): Superman = new Superman(man.name)

val leo = new Man("leo")
leo.emitLaser

** Scala什么时候会进行隐式转换?
1 调用某个函数,但传入参数的类型与函数定义的参数类型不匹配(函数)
2 调用某个方法,虽然该类有这个方法,但给方法传入的参数类型,与方法定义的参数类型不匹配(方法)
3 使用某个对象,调用某个方法,但这个方法并不存在于该类时

—-隐式参数———————

** 在函数或方法中,用implicit来修饰的参数即为隐式参数
** Scala会尝试找到一个对应类型的、用implicit修饰的对象,即隐式值,并将其作为参数注入
** Scala会在两个范围内查找:一个是当前作用域内可见的val或var定义的隐式变量
** 另一个是隐式参数类型的伴生对象内的隐式值

class SignPen {
  def write(content: String) = println(content)
}
implicit val pen = new SignPen

def signForExam(name: String) (implicit signPen: SignPen) {
  signPen.write(name + " come to exam in time.")
}
signForExam("aaa") 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值