scala----隐式转换浅析

implicit conversions

  • 类型转换
    scala中的implicit是指可以自动转换的值,或者是从一种类型到另一种类型的自动转 换。下面是官网给的一个简单的例子:
    "abc".map(_.toInt)
    本身String是不支持map方法的,但是StringOps 支持,此处字符串其实调用的就 StringOps 的map方法。String到StringOps的隐式转换定义在Predef对象下面@inline implicit def augmentString(x: String): StringOps = new StringOps(x)
    scala中许多隐式转换都定义在了该对象中。
    栗子
class ClassA
class ClassB(p: ClassA) {
  def method = println("I am ClassB")
}
object ImplicitTest {
  def main(args: Array[String]): Unit = {
    import Transform.aToB
    new ClassA().method  //ClassA没有method方法,会自动在作用域内寻找匹配的转换类型,通常将隐式转换定义在伴生对象中,因为其对所有对象都是可见的
  }
}
object Transform {
  implicit def aToB(p: ClassA): ClassB = new ClassB(p)  //此处提供了ClassA到ClassB的自动转换
}

-当A需要method这个方法的实现,而你又不想破坏A类原本的结构,就可以给其提供到B的隐式转换。注意:1.B类的构造器必须接收A类的对象作为参数。2.需要import隐式转换。3.隐式转换必须定义在object 对象里面

  • 参数的隐式转换
object ImplicitTest {
  def main(args: Array[String]): Unit = {
  import Transform.x
    method   //method方法参数声明为implicit,编译器会在作用域内寻找能够匹配的参数值
  }
  def method(implicit x: String) = println(x)
}
object Transform{
	implicit val x: String = "你真2"
}

-函数的隐式转换

object ImplicitTest {
  def main(args: Array[String]): Unit = {
 	 import Transform.implicitFun
   	 method(10)   //编译器会在作用域内寻找能够匹配的函数
  }
  def method(x: Int)(implicit f: Int => Unit): Unit ={
    f(x)
  }
}
object Transform{
	 implicit def implicitFun(x: Int): Unit = println(x)    //提供了 Int => Unit 类型函数的隐式转换
}

-其实上面两种implicit没什么区别,函数式编程的核心思想就是一切皆对象,也就是说函数其实也是一个对象,这种思想其实在scala里面随处可见(个人见解)

-隐式类

object ImplicitTest {
  def main(args: Array[String]): Unit = {
    import Transform.MyImplicit
    2.method
  }
object Transform {
  implicit class MyImplicit(p: Double){   // 接收Double参数 ,提供Double类到该类的隐式转换
    def method = println("I am MyImplicit")
  }
}

就到这儿吧!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值