scala的隐式对象和隐式类

一,隐式对象

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

scala 复制代码
package imp

/*
*
*    背景:已有一个写好的类,要求在不修改这个类的源代码的情况下,拓展这个类的新功能
*
*     思路:
*         1,补充定义一个新类,在这个新类中提供新方法
*         2,提供一个隐式转换函数,把之前旧类对象转换成这个新类对象
 */
object imp05 {
  class User() {
    def insertUser():Unit = {
      println("insertUser......")
    }
  }
  class UserStrong() {
    def updateUser():Unit={
      println("ipdateUser......")
    }
  }
implicit def xxxxx(user: User):UserStrong={
  println("自动调用隐式转换函数......")
  new UserStrong
}

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

隐式类

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

scala 复制代码
package imp

/*
*
*    背景:已有一个写好的类,要求在不修改这个类的源代码的情况下,拓展这个类的新功能
*
*     思路:
*         1,补充定义一个新类,在这个新类中提供新方法
*         2,提供一个隐式转换函数,把之前旧类对象转换成这个新类对象
*
*    隐式类
*   implicit class
*
*    作用:在不修改原来类的基础之后,增加新的功能。
 */
object imp05 {
  class User() {
    def insertUser():Unit = {
      println("insertUser......")
    }
  }
  implicit class UserStrong(user: User) {
    def updateUser():Unit={
      println("ipdateUser......")
    }
  }

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

二,案例:验证字符串是否合法

scala 复制代码
package imp

/*
*
*  目标:让任意一个字符串具备一个功能:判断是否是一个合法的手机号
*
*     String类是系统提供的,并没有isphone这个方法
*     现在就要去在不修改string类的情况下,增加这个方法
 */
object imp06 {
  implicit class StrongString(s:String) {
    def isPhone:Boolean = {
      val reg = "^1[35678]\d{9}$".r
      reg.matches(s)
    }
    def isIDCard:Boolean = {
      val reg = "^\d{17}[\dXx]$".r
      reg.matches(s)
    }
  }
  
  def main(args: Array[String]): Unit = {
    val str = new String("13036197649")
    //val str = "13036197649"
    //str.isPhone()//判断自己是否是一个合法的手机号,返回值是boolean。true。false
    println(str.isPhone)
    println("1303456754a".isPhone)
    println("1304595462a".isPhone)
    println("421055202110223143".isIDCard)// true
    println("40900520211022135a".isIDCard)//false
  }
}

三,计算阶乘

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

n! = 1293...*n

5!=1 * 2 * 3 * 4 * 5 =120

scala 复制代码
package imp

import scala.language.postfixOps

/*
*
* 目标:让任意一个整数具备一个功能:计算阶乘
* n! = 1*293*...*n
* 5!=1 * 2 * 3 * 4 * 5 =120
 */
object imp07 {
  implicit class StrongInt(n: Int) {
    def ! : Int = {
      var rst = 1
      // Scala中循环的正确写法是"i <- 1 to n"
      for (i <- 1 to n) {
        rst *= i
      }
      rst
    }
  }
    def main(args: Array[String]): Unit = {
      println(4!)
      println(5!)
    }
  }
相关推荐
hopsky9 天前
《Scala 学习手册》核心内容详解
人工智能·学习·scala
abcy07121319 天前
scala playframework 搭建与新建controller教程
scala
lpfasd12319 天前
编程语言榜单变迁分析
开发语言·后端·scala
戮漠summer1 个月前
Missing Semester 计算机教育中缺失的一课 Lecture 01 Shell
开发语言·后端·scala
醉熏的石头2 个月前
Ubuntu 中的编程语言(中)
linux·ubuntu·scala
Irene19912 个月前
Scala、Java、Python、JavaScript 的核心特性和应用场景(Python 的“单机“局限性:GIL 机制导致的多核并行缺陷)
java·javascript·python·scala
李白的天不白2 个月前
确认 Nginx 配置文件是否真的生效
scala
醉颜凉3 个月前
Scala自定义Monad实战:从理论到应用的完整指南
大数据·算法·scala
那晚的她3 个月前
Scala中Set集合
开发语言·后端·scala
IvanCodes3 个月前
二、Scala流程控制:分支与循环
大数据·scala