scala隐式转换

 --利用隐式转换和隐式参数,你可以提供优雅的类库,对类库的使用者隐匿掉那些枯燥乏味的细节。

概念:
Scala 提供的隐式转换 和隐式参数功能,是非常有特殊的功能。是Java等编程语言没有的功能。他可以允许你手动指定,将某种类型的对象转换成其他类型的对象,通过这些功能,可以实现非常强大、而却特殊的功能。
Scala的隐式转换,其实最核心的就是定义隐式转换函数,即 implicit conversion function。定义的隐私转换的函数,只要在编写的程序内引入,就会被 Scala自动使用,Scala 会根据隐式转换函数的签名,在程序中使用到隐私转换函数接收的参数类型定义的对象时,会自动将其传入隐式转换函数,转换为另一种类型的对象并返回。这就是“隐式转换”。
隐式函数叫什么名字无所谓, 因为通常不会有用户手动调用,而是有 Scala 进行调用,但是如果要使用隐式转换,则需要岁隐式转换函数进行导入。旖旎次通常建议将隐式转换函数的名称命名为 “one2one” 的形式。
Scala源码中有大量的隐式转换的隐式参数,因此必须精通这种语法。

作用:
隐式的对类的方法进行增强,丰富现有类库的功能;

隐式转换函数:

 是指那种以implicit关键字声明的带有单个参数的函数

例一:特殊售票窗口(只接受特殊人群,比如学生、老人等)(接收的参数不同时)
要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可。Scala会自动使用隐式转换函数,隐式转换与普通函数唯一的语法区别就是,要以 implicit 开头,而且一定要定义函数返回类型。

/**
** 一 、 参数转换 =》 类型转换 特殊窗口
**Created by Administrator on 2017/8/1 0001.
*/

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

object PMTask01{

  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 new SpecialPerson(null)
    //    else Nil
  }
  var ticketNumber = 0
  def buySpecialTicket(p:SpecialPerson) = {
    ticketNumber += 1
    println("T-" + ticketNumber)
  }

  def main(args: Array[String]): Unit = {
    val student = new Student("langwei")
    buySpecialTicket(student)
  }}

在这里插入图片描述

例二:超人变身 --使用隐式转换加强现有类型(调用类的不存在的方法)
隐式转换非常强大的一个功能,就是可以在不知不觉中加强现有类型的功能。也就是说,可以为某个类 定义一个加强版的类,并且定义互相之间的隐式转换,从而让源类在使用加强版的方式时,由Scala自动进行隐式转换为加强类,然后再调用该方法。
当man这类调用 emitLaser时,会发现自己没有这个方法,就会在附近查找是否有用man类型作为参数的隐式函数,如果发现就进行匹配;

object PMTask01{

  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)
  }

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

在这里插入图片描述

例三:考试签到 – 隐式参数

所谓的隐式参数,指的是在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数。
Scala会在两个范围内查找:一种是当前作用域内可见的val或var定义的隐式变量;一种是隐式参数类型的伴生对象内的隐式值

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

object test{
  implicit val signPen = new SignPen
  def signForExam(name: String) (implicit signPen: SignPen) {
    signPen.write(name + " come to exam in time.")
  }
 
  def main (args: Array[String] ): Unit = {
    signForExam("ll")
  }}

在这里插入图片描述

class SignPen {
  def write(content: String) = println(content)
}
object test{
  implicit val signPen = new SignPen
  implicit def studentIDto(a:Int):String = "笑趴下的孩子"
  def signForExam(id: Int) (implicit signPen: SignPen) {
    signPen.write(id)
  }
  def main (args: Array[String] ): Unit = {
    signForExam(11)
  }
}


在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值