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方法了。 } }