Spark零基础实战 第5章 Scala隐式转换彻底精通

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/myvanguard/article/details/86645002

第5章 Scala隐式转换彻底精通

Scala隐式转换让Scala编程语言更加富有表现力,不需要将一些显而易见的类型转换写进代码。Scala隐式转换也帮助实现不需要修改代码就可以扩展新功能。Scala隐式转换用implicit修饰符表示,可以作用在诸如类、参数和值等Scala关键字,使之分别成为隐式类、隐式参数和隐式值。

5.1隐式转换

5.1.1隐式转换的使用条件

隐式转换是函数参数或者对象的隐式转换,隐式值必须在伴生对象中声明。

隐式转换使用的条件。
(1)传入参数类型与预期类型不匹配时,会找是否有将该参数类型转为预期参数类型的隐式值; 如果调用该函数的对象可以找到匹配的隐式值,同样会发生隐式转换;
(2)当对象访问不存在的成员时,会找该对象是否有转换成其他对象的隐式值。

使用隐式转换的限制条件。
(1)implicit关键字只能用来修饰方法、变量(参数)和伴随对象;
(2)隐式转换的方法(变量和伴随对象)在当前范围内才有效。如果隐式转换不在当前范围内定义(比如定义在另一个类中或包含在某个对象中),那么必须通过import语句将其导入。

5.1.2隐式转换实例

隐式转换是Scala的重难点之一

隐式函数

object ImplicitTest {

    implicit def a2RichA(a:A)= new RichA(a)//定义一个名称为a2RichA的隐式方法
    def main(args: Array[String]): Unit = {
        val a = new A
        //对象A并没有rich方法,编译器会查找当前范围内是否有可转换的方法
        a.rich
    }

}

class Implicit{

}
class A{

}
class RichA(a: A){
    def rich: Unit ={
        println("Hello Scala Implicit")
    }
}

Int 类型隐式转换成String类型


//Int类型隐式转换成String类型
object Int2StringTest {
    implicit def int2String(i: Int) = i.toString

    def main(args: Array[String]): Unit = {
        //Int类型没有.length()方法
        println(3.length)
    }

}

导入隐式函数

object FuncTest {

    implicit def int2String(i:Int)=i.toString

}
object Int2StringTest{
//将FuncTest对象内部的成员导入到相应的作用域内,否则无法调用隐式函数
    import FuncTest._

    def main(args: Array[String]): Unit = {
        println(3.length)
    }
}

5.2隐式类

所谓隐式类:就是对类增加implicit限定的类,其作用主要是对类的加强。

隐式类实战

object PracticeTest {

    def main(args: Array[String]): Unit = {
        println(2.add(3))
    }

    implicit  class Cal(x:Int){
    //Int类型本省没有add方法
        def add(a:Int)={
            a +x;
        }
    }

}

5.3隐式参数详解

隐式参数实战

object ArglmplicitTest {

    def main(args: Array[String]): Unit = {
        hiScala
    }

    //函数的隐式值会在本实例域内找一个对应的字符串类型的隐式值。
    implicit val name: String = "tom"

    //implicit val sex:String = "male"
    def hiScala(implicit str: String): Unit = {
        println("str is " + str)
    }

}


5.4隐式值

隐式值就是定义在object对象中的隐式变量。

object VarImplicit {

    implicit val name: String = "history"

    def hiScala(implicit str: String): Unit = {
        println("str is " + str)
    }

    def main(args: Array[String]): Unit = {
        hiScala
    }

}

猜你喜欢

转载自blog.csdn.net/myvanguard/article/details/86645002