scala的隐式对象和隐式类

20 阅读2分钟

(一)隐式对象

隐式对象是一个带有implicit关键字的单例对象,它可以用于提供某种类型的实例以供隐式转换使用。隐式对象通常用于将某个类或trait的实例隐式地注入到方法中。

case class DatabaseConfig( driver: String, url: String)  
  
implicit object MySqlDefaultConfig extends DatabaseConfig(  
  "com.mysql.cj.jdbc.Driver",  
  "jdbc:mysql://localhost:3306/mydb")  
  
def getConnection(implicit config: DatabaseConfig): Unit = {  
  println(config.url)  
}  
getConnection

(二)隐式类

背景:有一个现有的类,它有一个方法。现在我们需要对这个类的功能进行拓展,额外补充一个方法。但是,不允许直接修改原来的类的代码。

假设这里有一个类User,它的内部有一个方法 insertUser

/**
 *  隐式类
 *
 * 背景:有一个现成的类,它有一个方法。我们现在需要对这个类的功能进行扩展:额外补充一个新方法
 *
 * 但是:不允许直接修改原来的类的代码
 *
 * 思路:
 *    1.补充一个新的类,把这个新的方法写到这个类中
 *    2.补充一个隐式转换函数,把这个旧类转成这个新类
 *
 * */

object imp05 {
  class User {
    def insertUser(): Unit = {
      println("添加一个新用户......")
    }
  }

  class UserExt {
    def updateUser():Unit = {
      println("修改用户......")
    }
  }

  implicit  def XXX(user: User):UserExt = {
    new UserExt
  }

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

    val u1 = new User()
    u1.insertUser()

    u1.updateUser()

  }

}

这个程序运行起来非常的稳定了,同时又不要去改动它之前的代码。 我们的基本思路是:再写一个类,然后在其中补充一个方法,然后让当前的类去使用这个方法。

/**
 *  隐式类
 *
 * 背景:有一个现成的类,它有一个方法。我们现在需要对这个类的功能进行扩展:额外补充一个新方法
 * 但是:不允许直接修改原来的类的代码
 *
 * 思路:
 *    1.补充一个新的类,把这个新的方法写到这个类中
 *    2.补充一个隐式转换函数,把这个旧类转成这个新类
 *
 * 隐式类:
 *    1. class 前面加implicit
 *    2. 入参就是要扩展功能的那个对象
 * */

object imp05 {
  class User {
    def insertUser(): Unit = {
      println("添加一个新用户......")
    }
  }

  implicit class UserExt(user: User) {
    def updateUser():Unit = {
      println("修改用户......")
    }
  }

//  implicit  def XXX(user: User):UserExt = {
//    new UserExt
//  }

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

    val u1 = new User()
    u1.insertUser()

    u1.updateUser()

  }
}

这样通过添加: 一个class + 一个 隐式function 的方式,对代码功能进行了拓展。

还可以更进一步简化: 思路如下:function 是一个函数,而构造函数也是函数,并且函数的名称并不敏感,只需要实现把一种类型,转换为另一种类型,就可以了。

最后:把implicit 加在类的前面,就是隐式类