Scala中的隐式转换和隐式参数

Scala提供的隐式转换和隐式参数功能,允许你手动指定,将某种类型的对象转换成其他类型的对象,通过这些功能,可以实现非常强大而且特殊的功能。
scala的隐式转换,最核心的就是定义隐式转换函数,即implicit conversion function.

1、隐式转换(案例:特殊售票窗口)

class SpecialPerson(val name:String)
class Student(val name:String)
class Older(val name:String)

object Main{

  def main(args: Array[String]): Unit = {
    val stu = new Student("students")
    buySPecialTicket(stu)

  }

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 old = obj.asInstanceOf[Older];
    new SpecialPerson(old.njame)
  }else null
}
  var ticker=0

  def buySPecialTicket(p:SpecialPerson)={
    ticker +=1
    println("T-" + ticker)
  }

}

2、使用隐式转换加强现有类型(案例:超人变身),类似于装饰着模式
隐式转换,可以为某个类定义一个加强版的类,并定义互相之间的隐式转换,从而让源类在使用加强版的类的方法时,由scala自动进行隐式转换为加强类,然后再调用该方法。

class Man(val name:String)
class SuperMan(val name:String){
  def emitLaster = println("emit a laster!")
}
 object Main{
   implicit def man2SUperMan(man:Man):SuperMan=new SuperMan(man.name)

   def main(args: Array[String]): Unit = {
     val leo = new Man("leo")
     leo.emitLaster
   }
 }

3、隐式转换函数的作用域与导入
scala默认会使用两种隐式转换:
1)一种是源类型或目标类型的伴生对象内的隐式转换函数;
2)一种是当前程序作用域内的隐式转换函数;
如果隐式转换函数不在以上两种情况的花,那么就需要用import语法导入某个包下的隐式转换函数。通常建议,仅仅在需要隐式转换的某个函数或方法里导入,这样可以缩小隐式转换函数的作用域,避免不必要的隐式转换。

4、隐式转换发生的时机
1)调用某个函数或对象的方法时,但是传入的参数类型与函数或方法的参数类型不匹配的情况;
2)使用某个对象的方法,而这个对象不存在这个方法时;

5、隐式参数
隐式参数,是指在函数或方法中,定义一个用implicit修饰的参数,此时,Scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数
示例代码如下:

class SignPen(){
  def write(content:String)=println(content)
}

 object Main{
   implicit val signPen = new SignPen

   def signForExample(name:String)(implicit signPen: SignPen){
     signPen.write(name + " come to exam in time.")
   }

   def main(args: Array[String]): Unit = {
     signForExample("lero")
   }
 }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容