掌握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
  • 1
  • 2
  • 3

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

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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")         //蛙泳
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

implicit的用法相关推荐

  1. scala implicit 关键字用法总结

    综述 implicit 关键字是scala中一个比较有特点的关键字,他保证了scala在很多时候没有一些不必要的代码冗余,使得scala在很多时候看起来更加简洁,同时使得scala的一些库在设计的时候 ...

  2. Scala之Implicit的用法

     Scala在面对编译出现类型错误时,提供了一个由编译器自我修复的机制,编译器试图去寻找一个隐式implicit的转换方法,转换出正确的类型,完成编译.这就是implicit 的意义. 一. 隐式转换 ...

  3. scala 隐式详解(implicit关键字)

    掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,可以把 ...

  4. oracle利用游标添加数据库,Oracle数据库游标的类型及使用实例全解

    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.Oracle数据库的Cursor类型包含三种: 静态游标:分为显式(explicit)游标 ...

  5. boost::hof::implicit用法的测试程序

    boost::hof::implicit用法的测试程序 实现功能 C++实现代码 实现功能 boost::hof::implicit用法的测试程序 C++实现代码 #include <boost ...

  6. C# implicit关键字的用法

    implicit 关键字用于声明隐式的用户定义类型转换运算符.如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换.隐式转换可以通过消除不必要的类型转换来提高 ...

  7. Android消息机制Handler用法

    这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.简述 Handler消息机制主要包括: Messa ...

  8. python的继承用法_Python 中的继承之Super用法

    以下Copy自官方文档说明,可点击查看官网源文 翻译内容属于德德自译,有不当之处请指正,勿喷... 翻译括弧中是德德自己理解,通过代码验证的,勿喷... super(type[, object-or- ...

  9. .net转换关键字:operator、explicit与implicit

    operator.explicit与implicit 很少用到,但也不能不知道,发现这篇写很好,转一篇 operator operator 关键字用于在类或结构声明中声明运算符.运算符声明可以采用下列 ...

最新文章

  1. XDP/eBPF — BPF
  2. python自动化办公兼职-用Python自动办公,做职场高手(完结)
  3. Delphi中流对象 TStream
  4. Winupdatelist
  5. 通过注册表修改IE的Internet选项
  6. songsoft-关于加薪的策略
  7. Qt Creator导出3D资产Exporting 3D Assets
  8. [Luogu2279][HNOI2003] 消防局的设立
  9. C语言运行gis空间叠加分析,GIS空间叠加分析与缓冲区分析.doc
  10. 大数据“下田”,未来农业将成为世界上最重要的产业之一
  11. 半正定矩阵的对角元素不小于该矩阵的最小特征值
  12. 2021肿瘤早筛行业研究报告
  13. Houdini分布式解算渲染,HQueue配置。
  14. 批量给 Word、PPT 和 PDF 插入封面或新的页面
  15. cisco 3750G 冗余备份
  16. EXE捆绑机制作原理
  17. 计算机个人市场调查实验报告,市场调查实验报告(一).doc
  18. 洛谷-P1424-小鱼的航程
  19. 用注册机给keil4 注册 ERROR R206: NO REGISTRY ACCESS, ADMINISTRATION RIGHTS REQUIRED
  20. unity中计算不规则模型的体积与表面积—三角面片与四面体

热门文章

  1. 实现漫画效果---OpenCV-Python开发指南(52)
  2. MFQ-PPDCS测试分析和测试设计 - 感觉有点虚,落地还是要结合实际工程应用
  3. Lex和Yacc使用方法(七).企业方面的实际应用
  4. win10 ntp服务器ip配置文件,win10 搭建ntp服务器配置
  5. 网络安全通识全解|第14期 那些常见的网络安全“黑话”
  6. Spring Boot中声明式数据库事务使用与理解
  7. linux-sfdisk 用法
  8. leetcode 79: 单词搜索
  9. 如何设计电池管理系统
  10. spring配置文件xsd报错的解决方法