scala的隐式转换
在整个作用域,隐式转换的名字要唯一
隐式有隐式值/隐式参数,隐式函数,隐式类,隐式对象
关键字implicit
转换时机
当方法的参数类型与目标类型不一致时
当调用的类里的方法与类中不一致时
也就是说编译器在隐式转换时是在查找缺失信息,这个缺失信息就在所在作用域里找。
1.隐式参数 (一个栗子)
1个匹配
object Demo9 extends App{
implicit val str = "lalala~~~~"
def im(implicit s:String):Unit={
println(s)
}
im
}
这里的im方法会默认传入str=“lalala~~~~”
多个匹配
object Demo9 extends App{
implicit val str = "lalala~~~~"
implicit val n = 2
def im(implicit s:String,a:Int):Unit={
println(s+a)
}
im
}
这里的im方法会默认传入s=“lalala~~~~”,a=2
2.隐式函数
隐式函数是将一种类型转换为另一种类型
object Demo{
implicit def f1(s:String):Int={
222
}
def f2(a:Int): Unit ={
println(a)
}
f2("qwe")
}
这里f2传的String=“qwe”也是对的。原因就是隐式转换了,自动调用了f1返回了int类型
package f2{
class C1 {
def m1() = {
println("m1")
}
}
class C2{
def m2()={
println("m2")
}
}
object Demo03_隐式视图 extends App{
//将 C1 转换为 C2 类型的
implicit def f1(a:C1) = new C2
val c1 = new C1
c1.m2()//c1对象具备了C2的m2的方法
}
}
这里的c1具备了C2的方法,但要注意的是f1里的a是C1类型。在调用方法的时候会自动匹配到f1这个隐式函数。
3.隐式类
可以比较有用的为一些写好的类添加方法,是对类功能增强的一种形式。
object DEmo{
implicit class MyFile(file:File) {
def plusf() = {
println("ke")
}
}
def main(args: Array[String]): Unit = {
val file = new File("")
//调用自己增强的方法
file.plusf()
}
}
结
scala是比较灵活的,在隐式转换中,scala会在当前域中查找有没有implicit修饰的,然后会利用隐式转换来执行方法或参数。