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!)
    }
  }
相关推荐
李白的天不白13 天前
确认 Nginx 配置文件是否真的生效
scala
醉颜凉15 天前
Scala自定义Monad实战:从理论到应用的完整指南
大数据·算法·scala
那晚的她15 天前
Scala中Set集合
开发语言·后端·scala
IvanCodes15 天前
二、Scala流程控制:分支与循环
大数据·scala
Veggie2615 天前
【Scala PyTorch深度学习】PyTorch On Scala系列课程 第十四章 29 PyTorch模型扩展自定义Module【AI Infra3】[PyTorch Scala硕士研一课程】
人工智能·深度学习·scala
Clf丶忆笙15 天前
搭建支持多语言开发的Quarkus环境:Java、Kotlin与Scala全栈指南
java·开发语言·云原生·kotlin·scala·quarkus
IvanCodes15 天前
四、Scala深入面向对象:类、对象与伴生关系
开发语言·后端·scala
嗯.~15 天前
scala的泛型应用场景
开发语言·后端·scala
醉颜凉15 天前
Scala Cats Effect纯函数式并发编程:从Fiber模型到生产级应用
大数据·网络·scala
2601_9611940217 天前
考研学校专业课真题
spring boot·考研·eclipse·log4j·scala·symfony