scala隐式转换函数

来源:互联网 发布:极客学院java百度网盘 编辑:程序博客网 时间:2024/06/03 13:32

定义:
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 SignPendef signForExam(name: String) (implicit signPen: SignPen) {  signPen.write(name + " come to exam in time.")}signForExam("aaa") 
原创粉丝点击