1. 程式人生 > >Scala(隱式轉換)-第七天

Scala(隱式轉換)-第七天

1、隱式轉換概述
    需求:為一個已存在的類新增一個新的方法
        java:動態代理
        scala:隱式轉換

2、隱式轉換實戰
    main{
        //定義隱式轉換函式即可
        implicit def man2superman(man:Man):Superman = new Superman(man)
        val man = new Man("Messi")
        man.fly()

        implicit def file2RichFile(file:File):RichFile = new RichFile(file)
        val file = new File("")
        val txt = file.read()
        println(txt)
    }
    
    class Man(val name:String){
        def eat():Unit={
            println(s"man[$name]eat..")
        }
    }

    class Superman(val name:String){
        def fly():Unit={
            println(s"superman[$name]fly...")
        }
    }

    class RichFile(cal file:File){
        def read()={
            scala.io.Source.fromFile(file.getPaht).mkString
        }
    }

3、隱式引數
    指的是在函式或者方法中,定義一個用implicit修飾的引數,此時Scala會嘗試找到一個指定型別的,用implicit修飾的物件,即隱式值,並注入引數
    main{
        場景一:
        testParam()    //編譯不報錯,執行報錯
        testParam("zhangsan")    //可以執行

        場景二:
        implicit val name = "implicit_name"
        testParam()    //此時沒有問題    implicit_name
        testParam("zhangsan")    //zhangsan

        場景三:
        implicit val s1 = "s1"
        implicit val s2 = "s2"
        testParam    //Error: ambiguous imolicit values


        def testParam(implicit name:String):Unit = {
            println(name+"~~~~~~~~")
        }
    }
    注意:方法,類,伴生類等中只要能找到都可以,


4、隱式類
    就是對類增加implicit限定的類,其作用主要是對類的加強!
    object ImplicitClass extends App{

        implicit class Calculator(x:Int){
            def add(a:Int)=a+x
        }
        println(12.add(3))    //成功

        println("12".add(3))    //失敗
    }