implicit的用法
掌握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的用法相关推荐
- scala implicit 关键字用法总结
综述 implicit 关键字是scala中一个比较有特点的关键字,他保证了scala在很多时候没有一些不必要的代码冗余,使得scala在很多时候看起来更加简洁,同时使得scala的一些库在设计的时候 ...
- Scala之Implicit的用法
Scala在面对编译出现类型错误时,提供了一个由编译器自我修复的机制,编译器试图去寻找一个隐式implicit的转换方法,转换出正确的类型,完成编译.这就是implicit 的意义. 一. 隐式转换 ...
- scala 隐式详解(implicit关键字)
掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,可以把 ...
- oracle利用游标添加数据库,Oracle数据库游标的类型及使用实例全解
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.Oracle数据库的Cursor类型包含三种: 静态游标:分为显式(explicit)游标 ...
- boost::hof::implicit用法的测试程序
boost::hof::implicit用法的测试程序 实现功能 C++实现代码 实现功能 boost::hof::implicit用法的测试程序 C++实现代码 #include <boost ...
- C# implicit关键字的用法
implicit 关键字用于声明隐式的用户定义类型转换运算符.如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换.隐式转换可以通过消除不必要的类型转换来提高 ...
- Android消息机制Handler用法
这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.简述 Handler消息机制主要包括: Messa ...
- python的继承用法_Python 中的继承之Super用法
以下Copy自官方文档说明,可点击查看官网源文 翻译内容属于德德自译,有不当之处请指正,勿喷... 翻译括弧中是德德自己理解,通过代码验证的,勿喷... super(type[, object-or- ...
- .net转换关键字:operator、explicit与implicit
operator.explicit与implicit 很少用到,但也不能不知道,发现这篇写很好,转一篇 operator operator 关键字用于在类或结构声明中声明运算符.运算符声明可以采用下列 ...
最新文章
- XDP/eBPF — BPF
- python自动化办公兼职-用Python自动办公,做职场高手(完结)
- Delphi中流对象 TStream
- Winupdatelist
- 通过注册表修改IE的Internet选项
- songsoft-关于加薪的策略
- Qt Creator导出3D资产Exporting 3D Assets
- [Luogu2279][HNOI2003] 消防局的设立
- C语言运行gis空间叠加分析,GIS空间叠加分析与缓冲区分析.doc
- 大数据“下田”,未来农业将成为世界上最重要的产业之一
- 半正定矩阵的对角元素不小于该矩阵的最小特征值
- 2021肿瘤早筛行业研究报告
- Houdini分布式解算渲染,HQueue配置。
- 批量给 Word、PPT 和 PDF 插入封面或新的页面
- cisco 3750G 冗余备份
- EXE捆绑机制作原理
- 计算机个人市场调查实验报告,市场调查实验报告(一).doc
- 洛谷-P1424-小鱼的航程
- 用注册机给keil4 注册 ERROR R206: NO REGISTRY ACCESS, ADMINISTRATION RIGHTS REQUIRED
- unity中计算不规则模型的体积与表面积—三角面片与四面体
热门文章
- 实现漫画效果---OpenCV-Python开发指南(52)
- MFQ-PPDCS测试分析和测试设计 - 感觉有点虚,落地还是要结合实际工程应用
- Lex和Yacc使用方法(七).企业方面的实际应用
- win10 ntp服务器ip配置文件,win10 搭建ntp服务器配置
- 网络安全通识全解|第14期 那些常见的网络安全“黑话”
- Spring Boot中声明式数据库事务使用与理解
- linux-sfdisk 用法
- leetcode 79: 单词搜索
- 如何设计电池管理系统
- spring配置文件xsd报错的解决方法