Scala 深入理解隐式转换
1. 隐式转换
Scala 提供的隐式转换和隐式参数功能,是非常有特色的功能。是 Java 等编程语言所没有的功能。它可以允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法。通过这些功能,可以实现非常强大、特殊的功能。
Scala 的隐式转换,其实最核心的就是定义隐式转换方法,即 implicit
conversion function。定义的隐式转换方法,只要在编写的程序内引入,就会被Scala 自动使用。Scala 会根据隐式转换方法的签名,在程序中使用到隐式转换方法接收的参数类型定义的对象时,会自动将其传入隐式转换方法,转换为另外一种类型的对象并返回。这就是“隐式转换”。其中所有的隐式值和隐式方法必须放到 object 中。
然而使用 Scala 的隐式转换是有一定的限制的,总结如下:
- implicit 关键字只能用来修饰方法、变量(参数)。
- 隐式转换的方法在当前范围内才有效。如果隐式转换不在当前范围内定义(比如定义在另一个类中或包含在某个对象中),那么必须通过 import 语句将其导。
2. 隐式参数
所谓的隐式参数,指的是在函数或者方法中,定义一个用 implicit 修饰的参数,此时 Scala 会尝试找到一个指定类型的,用 implicit 修饰的参数,即隐式值,并注入参数。
Scala 会在两个范围内查找:
- 当前作用域内可见的 val 或 var 定义的隐式变量;
- 一种是隐式参数类型的伴生对象内的隐式值;
3. 隐式转换方法作用域与导入
- Scala 默认会使用两种隐式转换,一种是源类型,或者目标类型的伴生对象内的隐式转换方法;一种是当前程序作用域内的可以用唯一标识符表示的隐式转换方法。
- 如果隐式转换方法不在上述两种情况下的话,那么就必须手动使用
import 语法引入某个包下的隐式转换方法,比如 import test._。通常建议,仅仅在需要进行隐式转换的地方,用 import 导入隐式转换方法,这样可以缩小隐式转换方法的作用域,避免不需要的隐式转换。
4. 隐式转换的时机
- 当对象调用类中不存在的方法或成员时,编译器会自动将对象进行隐式转换
- 当方法中的参数的类型与目标类型不一致时
喜欢就点赞评论+关注吧
感谢阅读,希望能帮助到大家,谢谢大家的支持!