版权声明:Collected by Bro_Rabbit only for study https://blog.csdn.net/weixin_38240095/article/details/84135804
一、概述
- 其功效类似于SpringMVC中DataBind中调用的ConversionService(Converters)
- 最核心的任务是定义隐式转换函数(函数!!!函数!!!),即implicit conversion function
- 定义的隐式转换函数,只要在程序内引入,就会被Scala自动使用。
当程序中使用到隐式转换函数所接收的参数类型的对象时,Scala会自动将其传入隐式转换函数,转换为另一种类型的对象并返回 - 隐式转换函数叫什么名字是无所谓的,因为通常不会由用户手动调用,而是由Scala自动调用。但如果要使用隐式转换,则需要对隐式转换函数进行导入。因此通常建议将隐式转换函数命名为"xxx2yyy"的形式
二、如何进行隐式转换
- 要实现隐式转换,只要在程序可见范围内定义隐式转换函数即可
- 隐式转换函数于普通函数的唯一语法区别:以implicit开头,且必须声明函数的返回类型
三、使用隐式转换增强现有类型(装饰模式)
四、导入隐式转换函数的作用域
-
Scala默认使用两种隐式转换
(1)源类型或目标类型的伴生对象中声明的隐式转换函数
(2) 当前程序作用域内可用唯一标识符确定的隐式转换函数 -
如果隐式转换函数不在上述默认位置的话,就必须手动import导入某个包下的隐式转换函数
-
通常建议:仅在需要进行隐式转换的地方(如函数体或方法体内)用import导入隐式转换函数以缩小隐式转换函数作用域,避免不必要的类型转换
五、隐式转换的发生时机
- 调用某个函数,但传入的实参类型于定义的形参类型不匹配
- 使用某个对象调用其类中不存在的方法
- 使用某个类型的对象,调用某个方法,虽然该类中存在该方法,但传入的实参类型与定义的形参类型不匹配
六、隐式参数(类DI)
-
隐式参数,是指在函数或方法内,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的隐式值进行注入
-
查找范围:
(1) 当前作用域内可见的val或var定义的隐式变量
(2) 隐式参数类型的伴生对象内的隐式值
(3) 案例