Scala的隐式转换

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修饰的,然后会利用隐式转换来执行方法或参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值