隐式转换
一个小问题:
先看一段代码
从高精度向低精度转换,出错
隐式转换函数是以 implicit 关键字声明的带有单个参数的函数,这种函数将会自动应用,将值从一种类型转换为另一种类型,
要注意需要有返回类型和返回值
小案例:
源码:
隐式转换的注意事项:
1)隐式转换函数的函数名可以任意,隐式转换与函数名无关,只与函数签名(签名即函数参数类型和返回值类型)有关
2)隐式转换函数可以有多个,但匹配只能是唯一的
可以有多个函数指:可以有将double 型转换成 Int ,Float 转换为 Int 这样的多个隐式转换函数
匹配唯一指:不可以有多个作用相同的隐式转换函数
用隐式转换 丰富类库功能
因为有了先入为主的概念,我刚开始只觉得隐式函数只能做一些数据类型的转换,并没有太大用处,但是继续学习,发现这个功能真的是很好,不得不佩服开发者马丁
比如下面的案例:
MySql 并不能调用Oracle 中的 delete 方法
如何可以让 Mysql 的实例对象调用 Oracle 中的方法呢?
这里就可以用到 隐式转换
隐式值
隐式值也叫隐式变量,将某个形参变量标记为 implicit
编译器会在方法省略隐式参数的情况下去搜索作用域内的隐式值作为缺省参数
可以作用在多个函数形参
上面调用hello 方法时,不需要带() ,带()就会发生错误
隐式值的优先级和一些注意事项:
同一作用域内不可以有多个类型相同的隐式值
当同时有隐式值和默认值时,implicit(隐式值的默认值高)
当匹配不到隐式值,仍会使用默认值:
当没有默认值,也没有匹配到隐式值时,就会报错
小结:
1)当程序中,同时有 隐式值,默认值,传值时
2)编译器的优先级为 传值 > 隐式值 > 默认值
3)在隐式值匹配时,不能有二义性(不能同时匹配多个值)
4) 隐式值,默认值,传值 都匹配不到时,就会报错
隐式类
声明隐式类: implicit 类
特点:
1)隐式类所带的构造参数有且只能有一个
2)隐式类必须被定义在 “类” 或 “伴生对象” 或 “包对象” 里,即 隐式类不能是顶级的,这样就会失去作用域
3)隐式类 不能是 case class
4)作用域内不能有与之相同名称的标识符
隐式的转换时机
1)当方法中的参数的类型 与 目标类型 不一致时
2)当对象调用 所在类中不存在的方法或成员时,编译器会自动将对象进行隐式转换
注意:隐式操作不能嵌套
----观看韩顺平老师Scala课程笔记