隐式类——实际应用场景

21 阅读1分钟

(一)案例:检查自己是不是一个合法的手机号码?

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

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

    var str1 = "abcdefghijk"

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

  }

}

结果:

abcdefghijk 不是手机号

补充一个隐式类,它的功能是 :接收一个字符串,得到一个对象,这个对象就有这个isPhone方法。

(二)案例:计算阶乘

需求说明:给一个所有的整数添加一个功能,例如:

3! = 3 * 2 * 1。

println(3!) // 输出6

思路分析:与上面的增强版字符串一样,我们这的整数是增强版的整数。

import scala.language.postfixOps

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

object imp07 {

  implicit class StrongInt(n:Int) {
    def !()  = {
      // 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

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

  }

}

结果:

5 的阶乘是: 120

请特别注意implicit class

隐式对象,主要充当默认值的作用。

隐式类,用来增加现有类的功能。