学习链接:https://www.bilibili.com/video/BV1Xh411S7bP?p=138&spm_id_from=pageDriver
当编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用<br />于将类型进行转换,实现二次编译
1 隐式函数
隐式转换可以在不需改任何代码的情况下,扩展某个类的功能
// 通过隐式转化为 Int 类型增加方法
class MyRichInt(val self: Int) {
def myMax(i: Int): Int = {
if (self < i) i else self
}
def myMin(i: Int): Int = {
if (self < i) self else i
}
}
object TestImplicitFunction {
// 1. 隐式函数
// 使用implicit关键字声明的函数称之为隐式函数
implicit def convert(arg: Int): MyRichInt = {
new MyRichInt(arg)
}
def main(args: Array[String]): Unit = {
// 当想调用对象功能时,如果编译错误,编译器会尝试在当前作用域范围内查找能调用对应功能的转换规则,这个调用过程是由编译器完成的,称之为隐式转换
println(2.myMax(6))
}
}
2 隐式参数
// 3. 隐式参数
// 参数名不相同,找的是相同类型
implicit val str: String = "aaa"
def sayHello(implicit name: String): Unit = {
println("hello" + name)
}
// def sayHi()(implicit name: String = "bbb"): Unit,隐式值会覆盖默认值
def sayHi()(implicit name: String): Unit = {
println("hi" + name)
}
sayHello
sayHi() // 函数声明是有括号要加括号
// 简便写法
implicit val age: Int = 20
def hiAge(): Unit = {
println("hi," + implicitly[Int])
}
hiAge()
3 隐式类
def main(args: Array[String]): Unit = {
// 当想调用对象功能时,如果编译错误,编译器会尝试在当前作用域范围内查找能调用对应功能的转换规则,这个调用过程是由编译器完成的,称之为隐式转换
println(2.myMax(6))
// 隐式类
implicit class MyRichInt2(val self: Int) {
def myMax2(i: Int): Int = {
if (self < i) i else self
}
def myMin2(i: Int): Int = {
if (self < i) self else i
}
}
println(12.myMax(2))
}
- 其所带的构造参数有且只能有一个
- 隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶