Scala的隐式转换
(一)隐式转换: 编译器 偷偷地,自动地帮我们把一种数据类型转换为另一种类型。例如:int --> double 它有失败的时候(double-->int),有成功的时候。 当它转换失败的时候,我们提供一个工具,让它能成功
(二)函数的隐式参数:
一直在修改原来的代码!!!
困难:函数有一个默认参数值,在不传入具体的实参时,就会自动使用这个默认值。
难点在于,这个默认值不能修改!
object Test48 {//函数参数的默认值def sayName(implicit name:String="小东"):Unit={println("我的名字是:"+ name)}//隐式值implicit val value:String="小张"def main(args: Array[String]): Unit = {sayName("小王")sayName()sayName}}
(三)隐式类:
任务:给之前的BaseUser添加新的功能,但是,不要直接去改代码
思路:把BaseUser 通过隐式转换,改成一个新类型,而这个新类型中有这新的方法。
implicit class ===一个隐式转换函数 + 类
它的作用:拓展已有类的功能,而不需要去修改之前的类的代码
object Test49 {implicit class PowerUser(b:BaseUser){def updateUser(){println("updateUser")}}// def transform(b:BaseUser) : PowerUser={
// new PowerUser()
// }//10 年,小王的写的代码class BaseUser{def showUser():Unit={println("showUser")}}def main(args: Array[String]): Unit = {val u1=new BaseUser()u1.showUser()u1.updateUser()}
}
(四)隐式对象:
package test39
import scala.language.postfixOps
// 需求:给整数添加一个功能,求阶乘
// 5! = 1*2*3*4*5 = 120object Test1 {implicit class XXXXX(d: Int) {def ! : Int = {println("阶乘函数被调用", d)120 // 写代码,完成1*2*3*...*d}}def main(args: Array[String]): Unit = {println(5.!)println(6!)}
}
object Test50 {implicit class XXXXX(d: Int){def ! : Int={println("阶乘函数被调用",d)// 写代码,完成1*2*3*...*dvar rs=1for (i<-1 to d){rs *= i}rs}}
}
case class DatabaseConfig(driver:String,url:String)//作为函数的隐式参数的默认值implicit object MySqlDefault extends DatabaseConfig("mysql","localhost:443")def grtConn(implicit config:DatabaseConfig):Unit={println(config )}def main(args: Array[String]): Unit = {grtConn}