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))    //失败
    }
 

猜你喜欢

转载自blog.csdn.net/weixin_42898914/article/details/85609870