发布时间:2022-10-26 文章分类:编程知识 投稿人:赵颖 字号: 默认 | | 超大 打印

隐式转换

精度小的类型可以自动转换为精度大的类型,这个转换过程无需开发人员参与,由编译器自动完成,这个转换操作我们称之为隐式转换。

隐式函数

object ScalaImplicit {
    def main(args: Array[String]): Unit = {
        implicit def transform( d : Double ): Int = {
            d.toInt
        }
        var d : Double = 2.0
        val i : Int = d
        printget="_blank">ln(i)
    }
}

隐式函数实现程序功能的扩展

符合OCP

    def main(args: Array[String]): Unit = {
        // 使用implicit声明的函数为隐式函数。
        implicit def thransform( user:User ): UserExt = {
            new UserExt()
        }
        val user = getUser()
        user.insertUser()
        user.updateUser()
    }
    class UserExt {
        def updateUser(): Unit = {
            println("update user...")
        }
    }
    class User {
        def insertUser(): Unit = {
            println("insert user...")
        }
    }
    def getUser() = {
        new User()
    }

隐式参数

def reg( implicit password : String = "000000" ): Unit = {
    println("默认密码:" + password)
}

隐式变量

implicit val password : String = "111111"
reg ==> 默认密码:111111

隐式类

在Scala2.10后提供了隐式类,可以使用implicit声明类,隐式类非常强大,同样可以扩展类的功能,在集合的数据处理中,隐式类发挥了重要的作用。

def main(args: Array[String]): Unit = {
 	val user = new User()
    user.insertUser()
    user.updateUser()
}
implicit class UserExt(user:User) {
    def updateUser(): Unit = {
        println("update user...")
    }
}
class User {
    def insertUser(): Unit = {
        println("insert user...")
    }

隐式机制

  1. 当前代码作用域

    implicit class UserExt(user:User) {
        def updateUser(): Unit = {
            println("update user...")
        }
    }
    
  2. 父类或伴生对象

    class Parent {
        implicit class UserExt(user:User) {
            def updateUser(): Unit = {
                println("update user...")
            }
        }
    }
    object Parent {
        implicit class UserExt(user:User) {
            def updateUser(): Unit = {
                println("update user...")
            }
        }
    }
    
  3. 特征或伴生对象

    trait MyTrait {
        implicit class UserExt(user:User) {
            def updateUser(): Unit = {
                println("update user...")
            }
        }
    }
    object MyTrait {
        implicit class UserExt(user:User) {
            def updateUser(): Unit = {
                println("update user...")
            }
        }
    
  4. 在其他地方声明(包对象)

    package object chapter {
        implicit class UserExt(user:User) {
            def updateUser(): Unit = {
                println("update user...")
            }
        }
    }
    
  5. 直接导入

    import com.atguigu.bigdata.scala.test.TestTransform._