掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit 可分为:

  • 隐式参数
  • 隐式转换类型
  • 隐式调用函数

1.隐式参数

当我们在定义方法时,可以把最后一个参数列表标记为implicit,表示该组参数是隐式参数。一个方法只会有一个隐式参数列表,置于方法的最后一个参数列表。如果方法有多个隐式参数,只需一个implicit修饰即可。 当调用包含隐式参数的方法是,如果当前上下文中有合适的隐式值,则编译器会自动为改组参数填充合适的值。如果没有编译器会抛出异常。当然,标记为隐式参数的我们也可以手动为该参数添加默认值。def foo(n: Int)(implicit t1: String, t2: Double = 3.14)

scala > def calcTax(amount: Float)(implicit rate: Float): Float = amount * rate
scala > implicit val currentTaxRate = 0.08F
scala > val tax = calcTax(50000F) // 4000.0

如果编译器在上下文没有找到第二行代码会报错

2.隐式地转换类型

使用隐含转换将变量转换成预期的类型是编译器最先使用 implicit 的地方。这个规则非常简单,当编译器看到类型X而却需要类型Y,它就在当前作用域查找是否定义了从类型X到类型Y的隐式定义
例子:

scala> val i: Int = 3.5 //直接报错
加上这句:
scala> implicit def double2Int(d: Double) = d.toInt
再运行,没报错
scala> val i: Int = 3.5  //i=3

3.隐式调用函数

隐式调用函数可以转换调用方法的对象,比如但编译器看到X .method,而类型 X 没有定义 method(包括基类)方法,那么编译器就查找作用域内定义的从 X 到其它对象的类型转换,比如 Y,而类型Y定义了 method 方法,编译器就首先使用隐含类型转换把 X 转换成 Y,然后调用 Y 的 method。
例子:

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 AminalTyperabbit.wantLearned("breaststroke")         //蛙泳
}

上例中编译器在rabbit对象调用时发现对象上并没有wantLearning方法,此时编译器就会在作用域范围内查找能使其编译通过的隐式视图,找到learningType方法后,编译器通过隐式转换将对象转换成具有这个方法的对象,之后调用wantLearning方法

scala 隐式详解(implicit关键字)相关推荐

  1. Scala 隐式(implicit)详解

    文章正文 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 1.Spark 中 ...

  2. 【Scala笔记——道】Scala 隐式Implicit

    Scala隐式 隐式究竟是什么呢? scala 中隐式相较于java 来说是一种全新的特性.那么隐式究竟是什么呢? 隐式存在三种基本使用方式: - 隐式属性 - 隐式方法 - 隐式对象 隐式属性例如 ...

  3. 无法将类型int隐式转换为string_Scala implicit 隐式转换安全驾驶指南

    这篇短文将结合实例对隐式转换的各种场景进行解释和总结,希望看完的人能够安全驶过隐式转换这个大坑. 隐式转换函数 隐式转换函数有两种作用场景. 1 转换为期望类型:就是指一旦编译器看到X,但需要Y,就会 ...

  4. VB2010 的隐式续行(Implicit Line Continuation)

    VB2010 的隐式续行(Implicit Line Continuation) 许多情况下,您可以让 VB 后一行继续前一行的语句,而不必使用下划线(_).下面列举出隐式续行语法的使用情形. 1.逗 ...

  5. 【软件分析】软件分析、设计与建模迭代式详解

    软件分析.设计与建模迭代式详解 1.introduction 1.1 OOA/D 1.2 Iterative, Evolutionary, and Agile 2.Case Study and Req ...

  6. 3000门徒内部训练绝密视频(泄密版)第5课:彻底精通Scala隐式转换和并发编程及Spark源码阅读

    彻底精通Scala隐式转换和并发编程及Spark源码阅读 Akka ,Scala内部并发 隐式转换.隐式类.隐式参数 可以手动指定某种类型的对象或类转换成其他类型的对象或类.转换的原因是假设写好接口 ...

  7. Java基础:详解static关键字与类加载顺序

    1. 前言 前文中说到了static关键字,在Java中这是一个很重要的关键字,它有很多的用法,并且在某些特定的情况下使用可以优化程序的性能.本文学习static关键字的应用场景.在这之前了解变量的类 ...

  8. C言语实现半隐式Euler解常微分方程(附完整源码)

    实现半隐式Euler解常微分方程 实现以下几个相关接口 实现半隐式Euler解常微分方程的完整源码(定义,实现,main函数测试) 实现以下几个相关接口 void problem(const doub ...

  9. 列表推导式详解:[i for i in L]

    python的一般for循环:for i in x:#x是列表对象 而列表推导式是:[i for i in x] 其意为:用for i in x的所有遍历结果i来组成一个新的列表 1.列表推导式详解: ...

最新文章

  1. jupyter|魔法函数问题| UsageError: Line magic function `%` not found
  2. binarytreenode”使用 类 模板 需要 模板 参数列表_c++1117 模板核心知识(一)—— 函数模板...
  3. 解决eclipse闪退的办法
  4. 简约的蓝色流量卡网站源码
  5. Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验
  6. volatile c语言_C语言系列文章之volatile
  7. vc语言c1083错误,VC Fatal Error C1083的几种解决方案
  8. Oracle 从入门到精通系列 - 思维导图计划
  9. NTVDM遇到一个硬错误
  10. Origin作向下柱状图
  11. SpringBoot实现分布式session
  12. 响铃:只做“连接器”,企业微信如何实现“人即服务”
  13. 位置 2 的索引无效。数组索引必须为正整数或逻辑值。
  14. Python实现平方根倒数速算法
  15. #c语言计算某年某月的天数
  16. 计算机专业浅谈:都说这行业35岁失业,是真的嘛?
  17. 文库网站建设小说在线阅读源码分享
  18. linux 在线和离线安装Mplayer视频播放器
  19. Vue实现离线创建项目
  20. 财政部及汇金承诺全额认购工行配股

热门文章

  1. 【Deep Learning】笔记:Understanding the difficulty of training deep feedforward neural networks
  2. 什么是数字化转型及落地
  3. C++学习之构造函数中的异常处理
  4. 【论文笔记】LeNet-5
  5. 简洁简约个人导航页引导源码PC手机自适应模板自定义背景以及音乐带后台包学会搜索引擎可收录
  6. 代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30
  7. 影响未来5年全球半导体和电子行业的十大因素
  8. string转TCHAR
  9. 2022-2028年全球及中国电气引线行业投资前景分析
  10. MySQL的MVCC及实现原理