您的位置:首页 > 编程语言

Scala 深入理解隐式转换

2018-03-04 23:08 148 查看

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. 隐式转换的时机

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

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

喜欢就点赞评论+关注吧



感谢阅读,希望能帮助到大家,谢谢大家的支持!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala 编程语言