内容简介:隐式转换函数是以首先看下面的代码如果想要转换成功,就需要借助隐式转换函数
隐式转换函数是以 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
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web协议与实践
克里希纳穆尔蒂 (KrishnamurthyBalachander) / 范群波 / 科学出版社 / 2003-7 / 46.0
本书全面论述了传输Web内容的系统和协议,重点讲述了Web中业已成熟和稳定的技术,如TCP/IP协议及DNS技术、HITP/1.0的设计及其与TCP之间的交互;深入阐述了Web高速缓存技术和多媒体流播技术的最新技术动态;分析了Apache Web服务器和Squid代理;还探讨了通信量的分析和测量技术。书中使用了大量示例、技术发展水平报告以及案例分析来阐述Web的工作原理和各个组件之间的交互。本书是......一起来看看 《Web协议与实践》 这本书的介绍吧!