隐式转换
当编译器编译程序发生错误,会尝试通过隐式转换将数据类型发生变化,看看是否能够编译通过,有时也叫做二次编译
隐式函数
object Scala_implicit {
def main(args: Array[String]): Unit = {
// 隐式函数以implicit关键字开头,其名字不重要,重要的是返回值和输入参数的类型
// 隐式转换的参数一般只有一个
// 一个类型的隐式转换规则不能出现多次,否则会发生错误
implicit def transform(i : Double): Int ={
// 这里加二我是想看看再隐式转换时能不能对值做操作
i.toInt+2
}
// 由于没有0.2不能转换为Int,所以通过隐式函数转换类型
var t : Int = 1.2
println(t)
}
}
隐式参数
- 同一个作用域中,相同类型的隐式值只能有一个
- 编译器按照隐式参数的类型去寻找对应类型的隐式值,与隐式值的名称无关。
- 隐式参数优先于默认参数
object Scala_implicit2 {
def main(args: Array[String]): Unit = {
def hello( dValue:String="default value")={
println(dValue)
}
implicit val str : String = "lkasfd"
def helloImplict (implicit dValue:String="default value")={
println(dValue)
}
// 隐式变换优先于默认参数
// 不过当指定隐式参数时不应当再继续指定参数列表
helloImplict
// 加入括号会使用默认值
helloImplict()
}
}
隐式类
object Scala06_Transform5 {
def main(args: Array[String]): Unit = {
// Scala可以使用隐式类来扩展功能
// 在类的声明前增加implicit关键字,这个类就是隐式类,可以自动完成隐式转换
// A类 => B类
// 隐式类必须有主构造函数,且必须只有一个参数,这个参数就是A类型
val user = new User()
user.insertUser()
user.updateUser()
}
class User {
def insertUser(): Unit = {
println("insert user....")
}
}
implicit class ExtUser(user:User) {
def updateUser(): Unit = {
println("update user...")
}
}
}
隐式寻找
- 首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。(一般是这种情况)
- 如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象。