Scala | 隐式类

15 阅读1分钟

一、隐式类

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

  • 思路:
  • 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.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()
  }
}

案例一

让所有字符串都具备一个功能:检查自己是不是一个合法的手机号码?

object imp06 {

  // 让所有的String对象,都有了一个新的方法 isPhone
  implicit class StrongString(s:String) {
    def isPhone():Boolean = {
      val reg = "^1[356789]\d{9}$".r
      reg.matches(s)
    }
  }

  def main(args: Array[String]): Unit = {
    val str = new String("1347752190")

    var str1 = "ababdsasaddo"

    // 判断自己是否是一个手机号、
    if(str1.isPhone) {
      println(s"${str}是手机号")
    } else {
      println(s"${str} 不是手机号")
    }
  }

}

案例二

让所有的整数都具备一个功能:计算阶乘

n! = 1 * 2 * 3 * 4 .... * n

  • 1.目前的整数类是没有这个功能的

  • 2.拓展Int这个类

import scala.language.postfixOps
object imp07 {
  implicit class StrongInt(n:Int) {
    def !():Int = {
      //println("阶乘.....")
      var s = 1
      for(i <- 1 to n) {
        s *= i
      }
      s
    }
  }

  def main(args: Array[String]): Unit = {
    var k = 5;  // 5 * 4 * 3 * 2 * 1 = 120

  // 计算k的阶乘
    println(s"${k}的阶乘是:${k!}")

  }

}