内容:
1.什么是隐式转换
2.隐式函数
3.隐式参数
4.隐式函数的转换规则
5.隐式函数的作用域
什么是隐式转换
隐式转换是指:scala自动把一种类型转成另一种类型的过程。这个过程对用户编程而言不可见,不需要用户手动编写代码。
内容和代码如图可见:
隐式函数
在scala.Predef中,可以看到有系统提供了默认的情况。
隐式函数的定义:通过implicit关键字修饰的函数,它的功能是把一种类型的数据转成另一种类型。
implicit def 函数名(参数:类型1):类型2 = {
函数体
}
注意点:
(1)调用时机,在系统自动把数据从类型1隐式转为类型2时出错时,被自动调用。
(2)函数名可以自定义(一般取名为类型1to类型2),但是参数和返回值必须有限制。
(二)隐式参数
如果一个参数的默认值会反复修改
来举个例子: 新的领导说用户密码是123456,在键盘的右边,对使用者不友好。要改成88888888
你看,这样就修改了原来的代码。
在开发的过程中,如果知道有个参数会被改动,就可以添加implicit,但是implicit在参数列表中只能出现一次,并要写在参数列表的最前面,对所有的参数列表生效。
如果一个函数有多个参数,并且你只想对某个参数进行隐式转换,那么,可以使用柯里化的方式来定义参数,并且把转换的参数定义在参数列表的最后。
先写入以下代码:
然后以下有问题完成:
如何去设置和解决问题,看以下:
这样改成之后就可以完成想要的效果了
转换规则
隐式转换确实非常的强大,但是,在具体的使用过程中,我们要遵循一些特定的转换规则。
具体来说有两点:无歧义规则,不能多次转换。下面我们分别来解释
规则1:无歧义规则:不能重新定义两个相同的转换函数。如果有两个隐式转换函数,只有函数名不同,则会导致错误。
来结合具体的代码说明
如下的代码会导致编译错误。
错误的原因是这里有两个转换函数,导致代码在编译时,无法确定使用哪一个。
规则2:不能多次转换:在一次转换过程中可以把A->B,B->C,但是不能直接从A->C。来通过具体的代码来说明。可以把M->BM, 把BM->KM,但是依靠这两个规则自动推导M->KM就会报错。也就是说:隐式转换时只能转换一次。
举例子代码如下:
作用域
接下来我们讨论一个问题:就是把隐式函数的定义放在哪里使用起来更加方便?当然了,在默认情况下,会在当前类的内部去找。
先说一个不能放的位置:implicit 不能放在顶级作用域(不能放在类的外边)看如下代码,就会报错
implicit class UserExt(user: User) {
def updateUser(): Unit = {
println("updateUser")
}
}
class User {
def insertUser(): Unit = {
println("insertUser")
}
}
object T1 extends OtherClass {
def main(args: Array[String]): Unit = {
val u1 = new User()
u1.insertUser()
u1.updateUser()
}
}
在实际的操作过程中,我们建议把它定义在如下两个地方:
1.包对象。这样在这个包下的所有类和对象中都可以使用,并且不需要额外的引入语句。
- 一个单独的文件定义中。这样在其他需要的位置就可以直接导入,然后使用。
在其他需要使用的地方导入: import implication.Implications._