隐式转换
scala允许开发人员自定义类型转换规则
将两个无关的类型通过编程手段让他们自动转换
隐式函数
object ScalaImplicit {
def main(args: Array[String]): Unit = {
//定义隐式函数 让Double 类型的变量自动转换为int类型
implicit def transform( d : Double ): Int = {
d.toInt
}
var d : Double = 2.0
val i : Int = d
println(i)
}
}
隐式参数 & 隐式变量
object ImplicitConversion {
def main(args: Array[String]): Unit = {
//隐式值/变量
implicit val dd : Double = 2.0
//隐式参数
def transform( implicit d : Double = 3.0 ) = {
d.toInt
}
//值调用顺序:隐式值 -> 隐式参数默认值 -> 前两者都没有 报错
println(transform()) //结果:3
//方法调用时,使用小括号会导致隐式值无法转递 所以这里调用的是隐式参数的值
println(transform)//结果:2
//不使用小括号可以传递隐式值
}
}
}
隐式类
在Scala2.10后提供了隐式类,可以使用implicit声明类,隐式类的非常强大,同样可以扩展类的功能,在集合中隐式类会发挥重要的作用。
其所带的构造参数有且只能有一个
隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的。
object ScalaImplicit {
def main(args: Array[String]): Unit = {
val emp = new Emp()
emp.insertUser()
}
class Emp {
}
//将一个类Emp 变成另外一个类 User
implicit class User( emp : Emp) {
def insertUser(): Unit = {
println("insert user...")
}
}
}
隐式机制
首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。(一般是这种情况)
如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象。