scala的隐式转换—底层实现

关键字: jvm方法调用    方法签名   唯一匹配

 

看了很多网上的教程  都差不多是你抄我 我抄你 而且说的都是表面的东西 没有往深处挖掘 今天在结合jvm分析方法调用的时候 找到一个新的思路 感觉挺靠谱的 拿出来和大家分享一下 (这个对于隐式值的理解没啥帮助 但是隐式类大大的帮助)

知道 jvm在进行方法调用的时候  有一个方法签名的,什么多态就是基于这个实现的  在java里面 方法的签名 都是唯一的 我们在java方法的调用过程中 不管是早绑定还是晚绑定 都是可以唯一确认的 找到对应的方法 在实际进行处理

 

在scala中(毕竞是基于jvm)也不例外(例外也无所谓 照着这个思路下去 理解这个隐式转换很容易的)在scala中的一切都是对象

一切行为都是方法 这就  但是方法必须是 唯一的 这就和jvm的方法调用联系上了  

但是 scala 这里做了一些进步 在编译器 从内存里面 寻找方法的时候 提供了一个容错机制 它从所在作用域内 尽可能的满足代码的调用  并且在查找对应方法 的时候 不是按照 java中那样 方法签名 严格匹配

举个例子java中进行函数的调用 需要严格说明 类 参数 方法名 但是在scala 中 这些条件 不用全部满足 只要满足部分就可以了 编译器会根据一部分信息 自己去寻找唯一匹配的 方法签名 从而完成调用

object Stringutils {
  implicit class StringImprovement(val s : String){   //隐式类
      def increment = s.map(x => (x +1).toChar)
  }
}
object  Main extends  App{
  import com.mobin.scala.implicitPackage.Stringutils._
  println("mobin".increment)
}

如下代码  "mobin".increment 这个方法签名 可以定位到唯一的方法 StringImprovement.increment(String)

在比如

class SwingType{
  def  wantLearned(sw : String) = println("兔子已经学会了"+sw)
}
object swimming{
  implicit def learningType(s : AminalType) = new SwingType
}
class AminalType
object AminalType extends  App{
  import com.mobin.scala.Scalaimplicit.swimming._
  val rabbit = new AminalType
    rabbit.wantLearned("breaststroke")         //蛙泳
}

AnimalType 没有方法 wantLearned 但是 我们把它看成一个整体rabbit.wantLearned("breaststroke") 这些信息组合在一起

不是正好是swimming.learningType(AnimalType).wantLearned(string)的方法签名吗 

 

隐式值转换也可以拿进来理解

bject ImplicitDefDemo {
  def foo(msg : String) = println(msg)
  implicit def intToString(x : Int) = x.toString
 // implicit def intToString2(x : Int) = x.toString
  def main(args: Array[String]) {
    foo(10)
  }
}

这个10 对应的唯一法签名 不正是intToString么

 

总结:

  scala隐式转换的核心思想是 在编译报错的情况下  通过代码中给定的条件 从作用域中 通过一些已有的处理方式 对部分数据进行转换 或者 通过模糊匹配找到合适的处理逻辑 从而完成功能 这是我结合jvm的方法调用的一个理解思路 貌似可以说的通  唯一加不进去的就是 那个隐式参数自动添加了 不过那个好理解 不用这么复杂 就是从作用域中 拉一个唯一和符合的值过来 底层怎么做的 暂时没想到

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值