隐士转换的基本概念:当编译器第一次编译失败的时候,会在当前环境中找到使代码编译成功的方法,进行二次编译
隐士转换的机制:首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。如果失败,继续在隐式参数的类型的作用域里查找。
类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象。
代码
package implict
/*
隐士转换的基本概念:当编译器第一次编译失败的时候,会在当前环境中找到使代码编译成功的方法,进行二次编译
隐士转换的机制:首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。如果失败,继续在隐式参数的类型的作用域里查找。
类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象。
*/
object test1 {
def main(args: Array[String]): Unit = {
//1.隐士函数实现类的自动创建
implicit def convert(num:Int):MyInt = new MyInt(num)
println(1.maxNum(2))
implicit val str: String = "hello world!"
hello
}
//2.隐士参数 编译器会在相应的作用域寻找符合条件的隐式值,一个作用域内只有一个隐士参数,与类型有关,隐士参数优于默认参数
def hello(implicit arg: String="good bey world!"): Unit = {
println(arg)
}
//3.隐士类 所带的构造参数有且只能有一个 隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的
implicit class MyInt1(val num1:Int) {
def maxNum2(num2:Int):Int = if (num2>num1) num2 else num1
def minNum2(num2:Int):Int = if (num2>num1) num1 else num2
}
println(13.maxNum2(14))
}
class MyInt(val num1:Int) {
def maxNum(num2:Int):Int = if (num2>num1) num2 else num1
def minNum(num2:Int):Int = if (num2>num1) num1 else num2
}
结果截图