2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数
目录
隐式转换和隐式参数
隐式转换
自动导入隐式转换方法
隐式转换的时机
隐式参数
隐式转换和隐式参数
隐式转换和隐式参数是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高级用法 隐式转换和隐式参数相关推荐
- 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)
目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class 特 ...
- 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法
目录 高阶函数用法 作为值的函数 匿名函数 柯里化(多参数列表) 闭包 高阶函数用法 Scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是"头等公民",它和Int. ...
- 2021年大数据常用语言Scala(三):Scala解释器
目录 scala解释器 启动scala解释器 执行scala代码 退出解释器 scala解释器 后续我们会使用scala解释器来学习scala基本语法,scala解释器像Linux命令一样,执行一条代 ...
- 2021年大数据常用语言Scala(四):基础语法学习 声明变量
目录 声明变量 语法格式 在解释器中定义一个变量 val和var变量 使用类型推断来定义变量 惰性赋值 声明变量 我们将来每一天编写scala程序都会定义变量.那scala语言如何定义变量呢? 语法格 ...
- 2021年大数据常用语言Scala(一):Scala简介
目录 一.Scala简介 为什么使用scala Scala对比Java 案例 一.Scala简介 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数编程 多范式:就是包含多种编程思 ...
- 2021年大数据常用语言Scala(十八):基础语法学习 Map对象
目录 Map对象 不可变Map 可变Map Map基本操作 Map对象 Map可以称之为映射.它是由键值对组成的集合.在scala中,Map也分为不可变Map和可变Map. 不可变Map 定义 语法 ...
- 2021年大数据常用语言Scala(二):Scala开发环境安装
目录 开发环境安装 安装JDK 安装scala SDK 步骤 具体操作 安装IDEA scala插件 步骤 开发环境安装 学习如何编写scala代码之前,需要先安装scala编译器以及开发工具 sca ...
- 2021年大数据常用语言Scala(十七):基础语法学习 Set
目录 Set 不可变集 可变集 Set Set(集)是代表没有重复元素的集合.Set具备以下性质: 元素不重复 不保证插入顺序 和List正好相反, List: 元素可以重复 保证插入顺序 scala ...
- 2021年大数据常用语言Scala(三十六):scala高级用法 泛型
目录 泛型 定义一个泛型方法 定义一个泛型类 上下界 协变.逆变.非变 非变 协变 逆变 泛型 scala和Java一样,类和特质.方法都可以支持泛型.我们在学习集合的时候,一般都会涉及到泛型. sc ...
最新文章
- Ubuntu16.04 永久修改主机名 hostname
- ASP.NET 2.0 的 Event Validation
- 对于微分的一些理解更新
- 100个LINUX站点
- word删除分节符后之前的格式乱了_办公室高级技能之Word邮件合并拆分
- python matplotlib 绘制曲线图,柱状图
- MPEG文件中什么是GOP
- NGINX下红黑树的删除(终章)附GIF
- react.js 多个组件集成示例
- 8天玩转并行开发——第六天 异步编程模型
- Linux中的静态库和动态库简介及生成过程示例
- 11-23-day05-python入门-字典与集合及文件
- 技术实操|Apache Spark 内存管理详解(上篇)
- CC++:计算某年某月的1号是星期几
- Linux下rsh服务配置
- 分享邮件营销群发的6大技巧!怎么群发邮件效果好?
- 报表功能升级|宜搭新增的这4项图表组件太好用了吧
- 垃圾回收器判断对象是否存活
- 数据建模和数据库设计
- 大数据毕设 - 网络游戏数据分析与可视化(python 大数据)