一、隐式转换函数
### --- 隐式转换函数

~~~     Scala的隐式转换最核心的就是定义隐式转换函数,即implicit conversion function。
~~~     定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用。
~~~     隐式转换函数由Scala自动调用,通常建议将隐式转换函数的名称命名为“one2one”的形式。
### --- 编程示例

~~~     # 示例1:下面代码中定义了一个隐式函数
class Num {}
class RichNum(num: Num) {
    def rich(): Unit = {
        println("Hello Implicit!")
    }
    }
    object ImplicitDemo {
        
        // 定义一个名称为num2RichNum的隐式函数
        implicit def num2RichNum(num: Num): RichNum = {
            new RichNum(num)
    }
    def main(args: Array[String]): Unit = {
        val num = new Num
        // num对象并没有rich方法,编译器会查找当前范围内是否有可转换的函数
        // 如果没有则编译失败,如果有则会调用。
        num.rich()
}
}
~~~     # 示例2:导入隐式函数

package test.implicitdemo
object Int2String {
    implicit def int2String(num: Int):String = num.toString
}
### --- string类型的length方法

~~~     下面代码中调用了String类型的length方法,Int类型本身没有length方法,
~~~     但是在可用范围内定义了可以把Int转换为String的隐式函数int2String,
~~~     因此函数编译通过并运行出正确的结果。
~~~     此示例中隐式函数的定义必须定义在使用之前,否则编译报错。
import test.implicitdemo.Int2String._
object ImplicitTest {
    def main(args: Array[String]): Unit = {
        println(20.length)
    }
    }
~~~     # 通过import test.implicitdemo.Int2String._,

~~~     将Int2StringTest内部的成员导入到相应的作用域内,否则无法调用隐式函数。
~~~     要实现隐式转换,只要在程序可见的范围内定义隐式转换函数即可,Scala会自动使用隐式转换函数。
~~~     隐式转换函数与普通函数的语法区别就是,要以implicit开头,而且最好要定义函数返回类型。
二、编程实现
### --- 编程代码

package yanqi.cn.part10

class Num{}
class RichNum(num:Num){
  def rich(): Unit ={
    println("hello implicit!")
  }
}

object ImplicitDemo {
  //定义一个隐式转换函数,命名要符合one2one的格式
  implicit def num2RichNum(num:Num):RichNum={
    new RichNum(num)
  }

  def main(args: Array[String]): Unit = {
    val num=new Num
    //num类型的对象没有rich方法,但是Scala编译器会查找当前范围内是否有隐式转换函数,
    //然后将其转换成RichNum类型,这样就可以访问rich方法了
    num.rich()
  }
}
### --- 编译打印

D:\JAVA\jdk1.8.0_231\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=61227:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\jdk1.8.0_231\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_231\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_231\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_231\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_231\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_231\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_231\jre\lib\rt.jar;E:\NO.Z.10000——javaproject\NO.Z.00002.Hadoop\ScalaPro\out\production\ScalaPro;D:\JAVA\scala-2.12.2\lib\scala-library.jar;D:\JAVA\scala-2.12.2\lib\scala-reflect.jar yanqi.cn.part10.ImplicitDemo
hello implicit!

Process finished with exit code 0

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor