隐式转换的一些总结
1.普通隐式转换
/**
* @author Jinxin Li
* @create 2020-10-28 18:50
* 编译器在编译时,有可能编译不通过
* 尝试在作用域范围内查找可以让程序编译通过的逻辑
* 然后使用这段逻辑进行二次编译,让编译通过
* 然后对指定的逻辑增加标记,告诉编译器这个标记可以进行二次编译
* implicit
*
* 相同作用域下,相同的隐式转换规则不能使用多次
*/
object Match01_match {
def main(args: Array[String]): Unit = {
implicit def transform(d:Double)={
d.toInt
}//隐式函数,当编译不通过时,编译器会自动寻找
val test = Test()
val age: Int = test.age//这里接收的是Int类型
println(age)
}
//第三方类库
class Test{
val age:Double = 20
}
object Test{
def apply(): Test = new Test()
}
}
2.不修改源码升级代码[重点]
object Match01_match {
def main(args: Array[String]): Unit = {
implicit def transform(user:User) ={
new UserExt()
}
val user = new User()
user.insertUser()
user.updateUser()
}
//---------------------------源码--------------
class User {
def insertUser(): Unit ={
println("insert user....")
}
}
//---------------------------源码--------------
class UserExt {
def updateUser(): Unit ={
println("update user....")
}
}
}
3.修改源码
需求:
/**
* @author Jinxin Li
* @create 2020-10-28 18:50
* 不改源码修改密码参数
*/
object Match01_match {
def main(args: Array[String]): Unit = {
def reg(password : String = "000000"): Unit ={
println("密码为"+password)
}
}
}
解决
/**
* @author Jinxin Li
* @create 2020-10-28 18:50
* 不改源码修改密码参数
*/
object Scala_Implicit {
def main(args: Array[String]): Unit = {
implicit val password = "123123"
def reg(implicit password: String = "000000"): Unit = {
println("密码为" + password)
}
reg//调用隐式
reg()
reg("12313")
}
}