ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Scala 速通语法(八)| 隐式转换

2021-09-26 12:03:55  阅读:166  来源: 互联网

标签:转换 函数 Scala 作用域 隐式 implicit def 速通


隐式转换


  • 隐式转换函数: implicit 关键字声明的带有单个参数的函数。这种函数将会自动应用,将值从一种类型转换为另一种类型
object ImplicitDemo01 {
  def main(args: Array[String]): Unit = {
    //编写一个隐式函数 完成Double-》Int
    implicit def ff(double: Double):Int={
      double.toInt
    }
    var a:Int = 3.8  //将double 隐式转换赋值给Int
  }
}
  • 注意与细节
    • 隐式转换函数的函数名可以是任意的,隐式转换与函数名称无关,只与函数签名(函数参数类型和返回值类型)有关
    • 隐式函数可以有多个(即:隐式函数列表),但是需要保证在当前环境下,只有一个隐式函数能被识别
    • 注意作用域 只能在当前作用域才能生效
    • 保证匹配的函数是唯一的
  • 使用
    • 隐式转换可以动态增加类的功能
    //接受一个类
    implicit def addDelete(msql:MySQL): DB = {
      new DB
    }
    // 使用其原本没有的方法
    mySQL.delete() // 编译器工作 分析 addDelete$1(mySQL).delete()
    

隐式值

  • 隐式值也叫隐式变量,将某个形参变量标记为 implicit,所以编译器会在方法省略隐式参数的情况下去搜索作用域内的隐式值作为缺省参数
    • 编译器优先级 传值 > 隐式值 > 默认值
    object ImplicitDemo02 {
      def main(args: Array[String]): Unit = {
        implicit val str:String = "zhy"
        def pl(implicit name:String): Unit ={
          println("str =" + name)
        }
        pl
      }
    }
    

隐式类

  • 在 scala2.10 后提供了隐式类,可以使用 implicit 声明类,隐式类的非常强大,同样可以扩展类的功能,比前面使用隐式转换丰富类库功能更加的方便,在集合中隐式类会发挥重要的作用
  • 特点
    1. 隐式类构造参数有且只能有一个
    2. 隐式类必须被定义在 类 或者伴生对象或者包对象里,即隐式类 不能是顶级的 (top-level-object)
    3. 隐式类不能是 case class
    4. 作用域不能有与之相同名称的标识符

在隐式转换时 需要注意

不能存在二义性
隐式操作不能嵌套使用

标签:转换,函数,Scala,作用域,隐式,implicit,def,速通
来源: https://www.cnblogs.com/zhy-god/p/15337401.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有