小记--------隐式转换与隐式参数

scala提供的隐式转换和隐式参数功能,它可以允许你手动指定,将某种类型的对象转换成其他类型的对象。
    scala的隐式转换,其实最核心的就是定义隐式转换函数,即:
implicit conversion function。定义隐式转换函数, 只要在编写的隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转换函数,转换为另外一种类型的对象并返回。
    如果要使用隐式转换,则需要对隐式转换函数进行导入,通常建议将隐式转换函数的名称命名为‘one2one’的形式。
 
隐式转换(案例:特殊售票窗口)
    要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可,scala会自动使用隐式转换函数,隐式转换函数与普通函数唯一的语法区别就是,要以implicit 开头,而且最好要定义函数返回类型
 
使用隐式转换加强现有类型(案例:超人变身)
    隐式转换,可以加强现有类型的功能,可以为某个类定义一个加强版的类,并定义互相之间的隐式转换,从而让源类在使用加强版的方法时,由scala自动进行隐式转换为加强类,然后再调用该方法。
 
导入隐式转换函数作用域
    scala默认会使用两种隐式转换,
        一种是源类型,或者目标类型的 ;
        一种是当前程序作用域内的可以用唯一标识符表示的隐式转换函数
    如果隐式转换函数不在上述两种情况下的话,那么就必须手动用import语法引入某个包下的隐式转换函数,比如import test._ 
    通常建议,仅仅在需要进行隐式转换的地方,比如某个函数或者方法内,用import导入隐式转换函数,这样可以缩小隐式转换函数的作用域,避免不需要的隐式转换。
 
隐式转换的发生时机
    1.调用某个函数,但是给函数传入的参数的类型,与函数定义的接收参数类型不匹配
    2.使用某个类型的对象,调用某个方法,而这个方法并不存在与该类型时
    3.使用某个类型的对象,调用某个方法,虽然该类型有这个方法,但是给方法传入的参数类型,与方法定义的接收参数的类型不匹配
 
定义好的传入参数类型为Sp  ,但是传入的参数实际上是S , 此时就会发生隐式转换。
 
隐式参数
    指的是在函书或者方法中,定义一个用implicit修饰的参数,此时scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数
    scala会在两个范围内查找:
        一种是当前作用域内可见的val或var定义的隐式变量
        一种是隐式参数类型的伴生对象内的隐式值
 
 
  def main(args: Array[String]): Unit = {
    class S{
      def w(c:String) = println(c)
    }
    // 这个就是隐式值
    implicit val s = new S
    def ww (name:String)(implicit  s:S): Unit ={
      s.w(name + " ssssss")
    }
 
 
    ww("zs")
    // 调用ww 的时候只传递了一个参数 name。  但是它还有一个implicit修饰的参数S
    // 因为没有传递该参数, 因为scala开始在作用域中找implicit修饰的变量并且类型
      // 是一致的,然后implicit修饰的是new S, 因此就可以调用S对象的w方法了。
  }
}
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/yzqyxq/p/12683410.html