目录

隐式转换和隐式参数

隐式转换

自动导入隐式转换方法

隐式转换的时机

隐式参数


隐式转换和隐式参数

隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能。我们可以很方便地利用隐式转换来丰富现有类的功能。

隐式转换

来看一个案例,

object SuperIntDemo {def main(args: Array[String]): Unit = {val a:Int = 1
// 使用中缀调用to方法println(a to 10)}
}

通过查看Int的源代码,你会惊奇地发现,Int类型根本没有to方法。这难道是让人怀疑人生的大bug吗?

——这其实就是隐式转换的强(gui)大(yi)之处。它在背后偷偷摸摸地帮我们了某种类型转换。

所谓隐式转换,是指以implicit关键字声明的带有单个参数的方法。它是自动被调用的,自动将某种类型转换为另外一种类型。

隐式转换的使用步骤:

在object中定义隐式转换方法(使用implicit)

在需要用到隐式转换的地方,引入隐式转换(使用import)

自动调用隐式转化后的方法

示例:使用隐式转换,让File具备有reada

class RichFile(val f:File) {// 将文件中内容读取成字符串def read() = Source.fromFile(f).mkString
}object MyPredef {// 定义隐式转换方法implicit def file2RichFile(f:File) = new RichFile(f)
}object ImplicitConvertDemo {def main(args: Array[String]): Unit = {val f = new File("./data/textfiles/1.txt")// 导入隐式准换import MyPredef.file2RichFile// 调用的其实是RichFile的read方法println(f.read())}
}

自动导入隐式转换方法

前面,我们手动使用了import来导入隐式转换。是否可以不手动import呢?

在scala中,如果在当前作用域中有隐式转换方法,会自动导入隐式转换。

示例:将隐式转换方法定义在main所在的object中

class RichFile(val f:File) {// 将文件中内容读取成字符串def read() = Source.fromFile(f).mkString
}object ImplicitConvertDemo {// 定义隐式转换方法implicit def file2RichFile(f:File) = new RichFile(f)def main(args: Array[String]): Unit = {val f = new File("./data/textfiles/1.txt")// 调用的其实是RichFile的read方法println(f.read())}
}

隐式转换的时机

什么时候会自动执行隐式转换呢?

当对象调用中不存在的方法时,编译器会自动将对象进行隐式转换

当方法中的参数类型与目标类型不一致时

示例:

object ImplicitConvertDemo {// 定义隐式转换方法implicit def file2RichFile(f:File) = new RichFile(f)def main(args: Array[String]): Unit = {val f = new File("./data/textfiles/1.txt")// test1接收的参数类型为Rich,此时也自动进行了隐式转换test1(f)}def test1(r:RichFile) = println(r.read())
}

隐式参数

函数或方法可以带有一个标记为implicit的参数列表。这种情况,编译器会查找缺省值,提供给该方法。

定义隐式参数:

在方法后面添加一个参数列表,参数使用implicit修饰

在object中定义implicit修饰的隐式值

调用方法,可以不传入implicit修饰的参数列表,编译器会自动查找缺省值

示例:

// 定义一个分隔符类
case class Delimiters(left:String, right:String)object MyPredef1 {implicit val quoteDelimiters = Delimiters("<<<", ">>>")
}object ImplicitParamDemo {// 使用分隔符将想要引用的字符串括起来def quote(what:String)(implicit delims:Delimiters) = delims.left + what + delims.rightdef main(args: Array[String]): Unit = {println(quote("hello, world")(Delimiters("<<", ">>")))// 手动导入import MyPredef1._println(quote("hello, world"))}
}

和隐式转换一样,可以使用import手动导入隐式参数

如果在当前作用域定义了隐式值,会自动进行导入

2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数相关推荐

  1. 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)

    目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class 特 ...

  2. 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法

    目录 高阶函数用法 作为值的函数 匿名函数 柯里化(多参数列表) 闭包 高阶函数用法 Scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是"头等公民",它和Int. ...

  3. 2021年大数据常用语言Scala(三):Scala解释器

    目录 scala解释器 启动scala解释器 执行scala代码 退出解释器 scala解释器 后续我们会使用scala解释器来学习scala基本语法,scala解释器像Linux命令一样,执行一条代 ...

  4. 2021年大数据常用语言Scala(四):基础语法学习 声明变量

    目录 声明变量 语法格式 在解释器中定义一个变量 val和var变量 使用类型推断来定义变量 惰性赋值 声明变量 我们将来每一天编写scala程序都会定义变量.那scala语言如何定义变量呢? 语法格 ...

  5. 2021年大数据常用语言Scala(一):Scala简介

    目录 一.Scala简介 为什么使用scala Scala对比Java 案例 一.Scala简介 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数编程 多范式:就是包含多种编程思 ...

  6. 2021年大数据常用语言Scala(十八):基础语法学习 Map对象

    目录 Map对象 不可变Map 可变Map Map基本操作 Map对象 Map可以称之为映射.它是由键值对组成的集合.在scala中,Map也分为不可变Map和可变Map. 不可变Map 定义 语法 ...

  7. 2021年大数据常用语言Scala(二):Scala开发环境安装

    目录 开发环境安装 安装JDK 安装scala SDK 步骤 具体操作 安装IDEA scala插件 步骤 开发环境安装 学习如何编写scala代码之前,需要先安装scala编译器以及开发工具 sca ...

  8. 2021年大数据常用语言Scala(十七):基础语法学习 Set

    目录 Set 不可变集 可变集 Set Set(集)是代表没有重复元素的集合.Set具备以下性质: 元素不重复 不保证插入顺序 和List正好相反, List: 元素可以重复 保证插入顺序 scala ...

  9. 2021年大数据常用语言Scala(三十六):scala高级用法 泛型

    目录 泛型 定义一个泛型方法 定义一个泛型类 上下界 协变.逆变.非变 非变 协变 逆变 泛型 scala和Java一样,类和特质.方法都可以支持泛型.我们在学习集合的时候,一般都会涉及到泛型. sc ...

最新文章

  1. Ubuntu16.04 永久修改主机名 hostname
  2. ASP.NET 2.0 的 Event Validation
  3. 对于微分的一些理解更新
  4. 100个LINUX站点
  5. word删除分节符后之前的格式乱了_办公室高级技能之Word邮件合并拆分
  6. python matplotlib 绘制曲线图,柱状图
  7. MPEG文件中什么是GOP
  8. NGINX下红黑树的删除(终章)附GIF
  9. react.js 多个组件集成示例
  10. 8天玩转并行开发——第六天 异步编程模型
  11. Linux中的静态库和动态库简介及生成过程示例
  12. 11-23-day05-python入门-字典与集合及文件
  13. 技术实操|Apache Spark 内存管理详解(上篇)
  14. CC++:计算某年某月的1号是星期几
  15. Linux下rsh服务配置
  16. 分享邮件营销群发的6大技巧!怎么群发邮件效果好?
  17. 报表功能升级|宜搭新增的这4项图表组件太好用了吧
  18. 垃圾回收器判断对象是否存活
  19. 数据建模和数据库设计
  20. 大数据毕设 - 网络游戏数据分析与可视化(python 大数据)

热门文章

  1. Gradle 将项目publish到Nexus,Kotlin将项目发布到nexus,springboot项目发布到maven仓库
  2. 2022-2028年全球与中国生物质燃料粒行业市场智研瞻分析报告
  3. Go 知识点(12) — 类型转换以三方库 cast
  4. mybatis使用注解开发
  5. 不要抱怨,勇敢向前走,你就能拥有更好的自己
  6. 【软件工程】VB版机房文档总结
  7. 台积电2nm与3nm制程
  8. OpenCL编程详细解析与实例
  9. 机器学习PAL基本概念
  10. 2021年大数据环境搭建(二):分布式环境搭建