内容简介:隐式转换函数是以首先看下面的代码如果想要转换成功,就需要借助隐式转换函数
隐式转换函数是以 implicit关键字 声明的带有 单个参数的函数 。这种函数将会 自动应用 ,将值从一种类型转换为另一种类型
① 隐式转换最佳入门案例
首先看下面的代码
如果想要转换成功,就需要借助隐式转换函数
为了更好的理解,我们看看反编译后的字节码文件,底层编译器是如何隐式转换函数的
根据需求我们可以将任意数据类型的对象转换为我们想要的数据类型,以及进行处理
implicit def func2(num: Long): Int = { (num - 1).toInt } val num2: Int = 10L println(num2) // 9 复制代码
② 隐式转换的细节
-
隐式转换函数的函数名可以是任意的,隐式转换与函数名称无关,只与函数签名(函数参数类型和返回值类型)有关。
-
隐式函数可以有多个(即:隐式函数列表),但是需要保证在当前环境下,只有一个隐式函数能被识别
③ 强悍的隐式转换丰富类库功能
如果需要为一个类增加一个方法,可以通过隐式转换来实现。(动态增加功能)比如想为 Oracle
类增加一个 delete
方法
看看底层编译器的 魔术
细节
在当前程序中,如果想要给 Oracle
类增加功能是非常简单的,但是在实际项目中,如果想要增加新的功能就会需要改变源代码,这是很难接受的。而且违背了软件开发的 OCP
开发原则
在这种情况下,可以通过隐式转换函数给类动态添加功能
④ 隐式值
隐式值也叫 隐式变量 ,将某个形参变量标记为 implicit ,所以编译器会在方法省略隐式参数的情况下去搜索 作用域内 的隐式值作为缺省参数
示例代码
细节练习
- 以下代码的函数命名编译器如何定义
看看底层编译器的字节码文件
-
隐式值细节
总结
-
隐式值的优先级高于默认值
-
当匹配到多个隐式值就会报错
-
⑤ 隐式类
在 Scala2.10
后提供了隐式类,可以使用 implicit
声明类,隐式类的非常强大,同样可以扩展类的功能,比前面使用隐式转换丰富类库功能更加的方便,在集合中隐式类会发挥重要的作用
示例代码
object Main { def main(args: Array[String]): Unit = { // 隐式类会独立生成一个 .class 文件,还会在当前 Main 类生成一个转换函数 implicit class Driver(oracle: Oracle) { def add(): Unit = { println("Driver add") } } val oracle = new Oracle // 实质上是调用了转换函数生成一个隐式类对象来调用 add 方法 oracle.add() // Driver add oracle.func() // Oracle func } } class Oracle { def func(): Unit = { println("Oracle func") } } 复制代码
隐式类的特点
-
其所带的构造参数有且只能有一个
-
隐式类必须被定义在
类
或伴生对象
或包对象
里,即隐式类不能是 顶级的 (top-level objects
) -
隐式类不能是
case class
(类型匹配) -
作用域内不能有与之相同名称的标示符
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 照片整理系列二 —— 照片整理及归档的辛酸历程
- 我自己整理的码农周刊一周分享整理
- JavaScript进阶系列-类型转换、隐式类型转换
- Android 多国语言转换 Excel 和 Excel 转换为 string
- 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理)
- [SSL证书转换(一)]关于JKS 转换成 CRT 和 KEY
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ACM图灵奖演讲集
阿申豪斯特 / 苏运霖 / 电子工业出版社 / 2005-4 / 55.0
本书完整地收录了这些演讲,并配之以部分获奖者撰写的后记,旨在反映过去数年来这一领域中发生的变化。对任何一位计算机科学的历史与发展有兴趣的人来说,本书都极具收藏价值。 本文收录了自图灵奖开始颁发的1966年起到1985年这20年间图灵奖获得者在授奖大会上所做演讲的全文。由于在此期间有三次是把奖项同时授予两个人的,而其中有两次两位获奖者分别做了演讲,因此一共收录了22篇演讲稿。本书把这些演讲分为两大......一起来看看 《ACM图灵奖演讲集》 这本书的介绍吧!