scala的隐式对象和隐式类

15 阅读1分钟

隐式类

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

思路:

1.补充一个新的类,把这个新的方法写到这个类中

2.补充一个隐式转换函数,把这个旧类转换成这个新类

  1. class前面加上implic

  2. 入参就是要拓展功能的那个对象

package imp
object imp04 {

  class User {    //现成的类
    def insertUser(): Unit = {
      println("添加一个新用户...")
    }
  }

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

  def main(args: Array[String]): Unit = {
  
    val u1 = new User()
    u1.insertUser()

    u1.updateUser()
  }
}

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

package imp
object imp05 {

  // 让所有的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("18118796852")

    var str1 = "abaadsfsdfs"


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

运行结果如图:

image.png

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

package imp

import scala.language.postfixOps
object imp06 {

  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;

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

运行结果如图:

image.png