scala隐式转换函数基本使用进阶(隐式类)

25 阅读2分钟

(一)背景:已有一个写好的类 要求在不修改这个类的源代码的情况下 拓展这个类的新功能!

思路:

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

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

还可以更进一步简化

思路如下:

function 是一个函数,而构造函数也是函数,并且函数的名称并不敏感,只需要实现把一种类型,转换为另一种类型,就可以了。

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

代码如下;

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

 implicit class UserStrong(user:User) {
    def updateUser():Unit = {
      println("updateUser...")
    }
  }

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

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

  }



}

运行结果;

insertUser...
updateUser...

(二)目标:让任意一个字符串具备一个功能 判断是否是一个合法的手机号(身份证号)

  • String类是系统提供的 并没有isPhone()方法

  • 现在就要去不修改String类的情况下 增加这个方法

代码如下;

object imp05 {
  implicit class String2Phone(s:String){
    def isPhon:Boolean={
      val reg = "^1[3456789]\d{9}$".r
      reg.matches(s)
    }
    def isIDcard: Boolean = {
      val reg= "^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$".r
      reg.matches(s)
    }
  }

  def main(args: Array[String]): Unit = {
    val str =new String("15907126869")
    println(str.isPhon) //判断自己是否是一个合法的手机号 返回值是boolean true
    println("134567891a".isPhon)// false
    println("15907126869".isPhon)//
    println("429116200904230664".isIDcard)
    println("42911620090423066a".isIDcard)

  }
}

运行结果;

true
false
true
true
false

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

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

代码如下:

import scala.language.postfixOps

/*
*目标:让任意一个整数具备一个功能 计算阶乘
* n!= 1 * 2* 3 * 4 *...n
*
* */
object imp06 {

  implicit class StrongInt(n:Int) {
    def ! : Int = {
      var rst = 1
      for (i <- 1 to n) {
        rst = rst * i
      }
      rst
    }
  }
  def main(args: Array[String]): Unit = {
    println(4!)//24
    println(5!) //120
  }
}

运行结果;

24
120