隐式转换,你可以手动指定在找不到方法或变量时将某种类型的变量或者类转换成指定的类型,就像从地狱中召唤一个自己没有功能,使用之后又回到自己原来的模样,这有别于强制类型转换。scala会根据上下文自动的转换。
隐式转换函数 ,在指定的类中找不到调用的方法时scala会自动寻找隐式转换函数
class People(val name: String, val salary: Double)
// 必须写 val
class Student(val name: String, val salary: Double) {
def code = println("code ...")
}
object People {
// 可以在伴生对象中去写
// 定义隐式类型转换
implicit def people2Student(p: People): Student = { // 函数名字不重要 可以随便写 但这个是最佳实践 使用implicit 实现隐式转换函数
new Student(p.name, p.salary)
}
}
隐式参数
有运行时上下文自动注入的参数,程序运行时自动的赋值
在实例上下文中建立很多对象,通过隐式参数注入到程序中。这样程序就会按照程序默认的设置去运行,类似于依赖注入,这是动态的默认配置,不是配置文件静态的配置。
如果一个方法定义了一个隐式参数,你调用该方法的时候可以不用手动赋值,程序自动获得隐式参数.
隐式类型的搜索,最优先的位置是伴生对象中 第二是一个总的object中然后导入就可以了 第三个就是上下文中。
// 隐式参数
class Level(val level: Int)
implicit val level = new Level(9)
def toWork(name: String)(implicit l: Level) = println(name + ":" + l.level) // 使用坷里化
toWork("hello")
隐式类
定义的类找不到的时候就执行转换为隐式类,
implicit class One(val second: Int) {
def read(num: Int) = num + second
}
println(1.read(2)) // 隐式对象转换 Int类找不到read方法
网友评论