Scala隐士函数的代码解析

本文详细介绍了Scala编程中的隐士转换和隐式参数的概念及机制。通过示例展示了如何使用隐士转换创建隐式函数、隐式类以及在函数中使用隐式参数。此外,还解释了隐式类的定义限制和作用域。内容包括隐士转换在编译过程中的应用,以及如何在代码中查找和使用隐式实体。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

隐士转换的基本概念:当编译器第一次编译失败的时候,会在当前环境中找到使代码编译成功的方法,进行二次编译
隐士转换的机制:首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。如果失败,继续在隐式参数的类型的作用域里查找。
类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象。
代码

package implict
/*
  隐士转换的基本概念:当编译器第一次编译失败的时候,会在当前环境中找到使代码编译成功的方法,进行二次编译
  隐士转换的机制:首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。如果失败,继续在隐式参数的类型的作用域里查找。
类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象。

 */
object test1 {
  def main(args: Array[String]): Unit = {
    //1.隐士函数实现类的自动创建
    implicit def convert(num:Int):MyInt = new MyInt(num)
    println(1.maxNum(2))
    implicit val str: String = "hello world!"
    hello
  }
  //2.隐士参数 编译器会在相应的作用域寻找符合条件的隐式值,一个作用域内只有一个隐士参数,与类型有关,隐士参数优于默认参数
  def hello(implicit arg: String="good bey world!"): Unit = {
    println(arg)
  }
  //3.隐士类 所带的构造参数有且只能有一个 隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的
  implicit class MyInt1(val num1:Int) {
    def maxNum2(num2:Int):Int = if (num2>num1) num2 else num1
    def minNum2(num2:Int):Int = if (num2>num1) num1 else num2
  }
  println(13.maxNum2(14))
}
class MyInt(val num1:Int) {
  def maxNum(num2:Int):Int = if (num2>num1) num2 else num1
  def minNum(num2:Int):Int = if (num2>num1) num1 else num2
}

结果截图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布丁味

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值