说明
当编译器第一次编译失败的时候,会在当前作用域中寻找能让diamagnetic编译通过的方法,用于将类型进行转换,实现二次编译。
隐式转换可以在不修改任何代码的基础上,对类的功能进行扩展。
当调用对象的某个功能时,如果编译错误,那么编译器会尝试在当前作用域中查找能调用该功能的转换规则,这个调用过程是编译器自动完成的,所以叫隐式转换,也叫自动转换。
隐式函数
object Scala01_Implicit {
// implicit 关键字声明隐式函数
implicit def convert(i: Int): MyInt = {
new MyInt(i)
}
def main(args: Array[String]): Unit = {
// 当调用对象的方法,如果编译错误,那么编译器会在当前作用域中寻找能调用该方法的转换规则,
// 因为调用过程是编译器完成的,所以称之为隐式转换,也叫自动转换。
println(1.myMax(10))
println(1.myMin(10))
}
}
class MyInt(val self: Int) {
def myMax(i: Int) = {
if (i > self) i else self
}
def myMin(i: Int) = {
if (i < self) i else self
}
}
隐式参数
- 一个作用域中,同类型的隐式参数只能有一个。
- 编译器会根据隐式参数的类型去寻找对应的隐式参数值,和参数名称无关。
- 隐士参数优先于默认参数。
implicit val word: String = "hello spark"
def hello(implicit w: String = "hello scala"): Unit ={
println(w)
}
def main(args: Array[String]): Unit = {
hello // hello spark
}
隐式类
- 隐式类的参数有且只能有一个。
- 隐式类只能定义在类中、伴生对象中、包对象中,即隐式类不能是顶级类。
object Scala03_Implicit {
// 定义隐式类
implicit class MyInt03(self: Int) {
def myMax(i: Int) = {
if (self > i) self else i
}
def myMin(i: Int) = {
if (self < i) self else i
}
}
def main(args: Array[String]): Unit = {
println(1.myMax(10))
println(1.myMin(10))
}
}