说明:可以动态扩展类的功能,当编译器第一次编译失败的时候,会在当前环境中查找能让编译通过的方法,该方法用于将类型进行转换,转换之后,进行二次编译,实现对类功能的扩展。
隐式函数:说明:使用implicit关键字声明的函数称之为隐式函数
案例
代码说明:通过隐式转换为Int类型增加方法max和min
//将Int数据类型,转换成WRichInt
implicit def convert(a:Int)={
new WRichInt(a)
}
def main(args: Array[String]): Unit = {
println(2.wMax(5))
}
}
class WRichInt(var self:Int){
def wMax(i:Int):Int={
if(self < i)
i
else
self
}
def wMIn(i:Int):Int={
if(self > i)
i
else
self
}
隐式参数:
说明:普通方法或者函数中的参数可以通过implicit关键字声明为隐式参数,调用该方法时,就可以传入该参数,编译器会在相应的作用域寻找符合条件的隐式值。
案例:
def main(args: Array[String]): Unit = {
implicit var a:Int = 10
def num(implicit x:Int):Int={
x
}
println(num)
}
在使用隐式参数时,调用函数不需要加(),同一个作用域中,相同类型的隐式值只能有一个,编译器按照隐式参数的类型去寻找对应类型的隐式值,与隐式值的名称无关。隐式参数优先于默认参数。
隐式类:说明:其所带的构造参数有且只能有一个,隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的。
案例
implicit class MyRichInt(arg: Int) {
def myMax(i: Int): Int = {
if (arg < i) i else arg
}
def myMin(i: Int) = {
if (arg < i) arg else i
}
}
def main(args: Array[String]): Unit = {
println(1.myMax(3))
}
隐式解析机制:
(1)首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)
(2)如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象



