一、隐式转换
当编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用
于将类型进行转换,实现二次编译
1、隐式函数
1)说明
隐式转换可以在不需改任何代码的情况下,扩展某个类的功能。
2)案例实操
需求:通过隐式转化为 Int 类型增加方法。
// 当想调用对象功能时,如果编译错误,那么编译器会尝试在当前作用域范
围内查找能调用对应功能的转换规则,这个调用过程是由编译器完成的,所以称之为隐
式转换。也称之为自动转换
package chapter09plus
/**
* 隐式函数和隐式类型
*/
object Test02_Implicit {
def main(args: Array[String]): Unit = {
//0、普通
val new12 = new MyRichInt(12)
println(new12.myMax(15))
//1、隐式函数
implicit def convert(num: Int): MyRichInt = new MyRichInt(num)
println(12.min(15))
println("------------------------------------")
println(12.min(15))
}
}
//自定义类
class MyRichInt(val self: Int) {
//自定义比较大小的方法
def myMax(n: Int): Int = if (n < self) self else n
def myMin(n: Int): Int = if (n < self) n else self
}
1、隐式类
1)案例实操
package chapter09plus
/**
* 隐式函数和隐式类型
*/
object Test02_Implicit {
def main(args: Array[String]): Unit = {
println("----------------隐式类--------------------")
//2、隐式类
implicit class MyRichInt2(val self: Int) {
//自定义比较大小的方法
def myMax2(n: Int): Int = if (n < self) self else n
def myMin2(n: Int): Int = if (n < self) n else self
}
println(12.myMax2(15))
}
}
3、隐式参数
package chapter09plus
/**
* 隐式函数和隐式类型
*/
object Test02_Implicit {
def main(args: Array[String]): Unit = {
//3、隐式参数
//只关心参数类型
implicit val str: String = "alice"
implicit val num: Int = 18
def sayHello(implicit name: String): Unit = {
println("hello, " + name)
}
def sayHi(implicit name: String = "alice"): Unit = {
println("hi, " + name)
}
sayHello
sayHi()
//4、简便写法 ----> implicitly[Int] 预先定义好的参数
def hiAge(): Unit = {
println("hi, " + implicitly[Int])
}
hiAge()
}
}