scala的隐式对象和隐式类

34 阅读3分钟

(一)隐式对象

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

(二)隐式类

目标:已有一个写好的类,要求在不修改这个类代码的情况下,扩展这个类的新功能

思路: 1.补充定义一个新类,在这个新类中提供新方法 2.提供一个隐式转换函数,把之前旧类对象转换成这个新类对象

代码如下:

package imp

/*

背景:已有一个写好的类,要求在不修改这个类代码的情况下,扩展这个类的新功能

思路:
1.补充定义一个新类,在这个新类中提供新方法
2.提供一个隐式转换函数,把之前旧类对象转换成这个新类对象
**/

object imp04 {

  class User() {
    def insertUser(): Unit = {
      println("insertUser........")
    }
  }

  class UserStrong(){
   def updateUser(): Unit = {
     println("updateUser..........")
  }
}
  implicit def xxxx(user:User):UserStrong={
    println("自动调用隐式转换函数.........")
    new UserStrong
  }

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

  }
}

结果如下:

image.png

隐式类

implicit class

作用:在不修改原来类的基础上,增加新功能

package imp

/*

背景:已有一个写好的类,要求在不修改这个类代码的情况下,扩展这个类的新功能

思路:
1.补充定义一个新类,在这个新类中提供新方法
2.提供一个隐式转换函数,把之前旧类对象转换成这个新类对象

隐式类
implicit class

作用:在不修改原来类的基础上,增加新功能
* */


object imp04 {

  class User() {
    def insertUser(): Unit = {
      println("insertUser........")
    }
  }

  implicit class UserStrong(user: User){
   def updateUser(): Unit = {
     println("updateUser..........")
  }
}
//  implicit def xxxx(user:User):UserStrong={
//    println("自动调用隐式转换函数.........")
//    new UserStrong
//  }

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



  }
}

运行结果如下:

image.png

(三)案例:验证字符串是否是一个合法的手机号

目标: 让任意一个字符串具备一个功能: 判断是否是一个合法的手机号。

String类是系统提供的,并没有isPhone这个方法。 现在就要去在不改String类的情况下,增加这个方法。

代码如下:

package imp

/*
目标: 让任意一个字符串具备一个功能: 判断是否是一个合法的手机号。

String类是系统提供的,并没有isPhone这个方法。
现在就要去在不改String类的情况下,增加这个方法。
**/
object imp05 {

  implicit class StrongString(s: String) {
    def isPhone: Boolean = {
      val reg = "^1[35678]\d{9}$".r
      reg.matches(s)
    }

    // 新增的身份证校验方法
    def isIDCard: Boolean = {
      val idReg = "^\d{6}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$".r
      idReg.matches(s)
    }

    }

    def main(args: Array[String]): Unit = {
      val str = new String("13617295643")
      // str.isPhone // 判断自己是否是一个合法的手机号,返回值是boolean: true,false
      println(str.isPhone)
      println("134567891a".isPhone)
      println("130567891a".isPhone)
      println("429005202011012231".isIDCard) //true
      println("42900520201101223a".isIDCard) //false
    }
}

结果如下:

image.png

(四)案例:计算阶乘

目标: 让任意一个整数具备一个功能: 计算阶乘。

例如: n!=123*.....*n

s!=12345=120

代码如下:

package imp

import scala.language.postfixOps

/*
   目标: 让任意一个整数具备一个功能: 计算阶乘。

   n!=1*2*3*.....*n
   s!=1*2*3*4*5=120
 */


object imp06 {
    // 隐式类扩展Int的阶乘方法
    implicit class StrongInt(n: Int) {
        def ! : Int = {
            var rst =1
            for (i <- 1 to n){
                rst *=1
            }
            rst
        }
    }

    def main(args: Array[String]): Unit = {
        println(4!) // 24(1×2×3×4)
        println(5!) // 120(1×2×3×4×5)
    }
}

结果如下:

image.png