第10章 隐式转换
package chapter10
object Test01_TestImplicit {
def main(args: Array[String]): Unit = {
val richInt = new MyRichInt(12)
println(richInt.myMax(15))
// 1. 隐式函数
implicit def convert(num: Int): MyRichInt = new MyRichInt(num)
println(12.myMax(15))
// 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.myMax(15))
// 3. 隐式参数,只要找到String类型的值,则替换name,因此在作用于范围内,不能有两个相同的隐式参数类型
// 传入的隐式值会覆盖掉默认值
implicit val str: String = "alice"
implicit val num: Int = 18
// 函数科里化,如果声明时sayHello(),则调用时用sayHello(),如果定义时sayHello,则调用时sayHello
def sayHello()(implicit name: String): Unit = {
println(s"hello $name")
}
def sayHi(implicit name: String = "Bob"): Unit = {
println(s"hi $name")
}
/**
* hello alice
* hi alice
*/
sayHello()
sayHi
//简便写法
/**
* hi, 18
* hi, 18
*/
def hiAge(implicit age: Int): Unit = {
println(s"hi, $age")
}
def hiAge1(): Unit = {
println(s"hi, " + implicitly[Int])
}
hiAge
hiAge1()
}
}
// 自定义类
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
}
}