scala的隐式对象和隐式类

32 阅读2分钟

隐式对象

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

隐式对象和前面讲的隐式参数比较类似,都是用来设置初始数据的。

隐式类

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

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

基本代码:

package imp

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



object imp04 {
  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()


  }

}

案例:验证手机号是否合法?

package imp

/**
 *需求:
 *  让所有字符串都具备一个功能:检查自己是不是一个合法的手机号码?
 *
 *  1. 目前的字符串类是没有这个功能的。
 *
 *  2. 拓展String这个类
 */



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("13678892476")

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

  }

}

案例:计算阶乘

package imp

import scala.language.postfixOps

/**
 *需求:
 *  让所有整数都具备一个功能:计算阶乘。
 *n!=1*2*3*4....*n
 *  1. 目前的字符串类是没有这个功能的。
 *
 *  2. 拓展String这个类
 */


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 = {
  val k=5;// 5*4*3*2*1=120
    // 计算k的阶乘
    println(s"${k}的阶乘是:${k!}")


  }

}