Scala隐式转换详解
1.隐式转换
当编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用于将类型进行转换,实现二次编译,而这些方法就是隐式转换,Scala编译器所做的事情要比Java编译器做的事情要多的多
通过隐式转换,程序员可以在编写Scala程序就可以省去一部分复杂重复的代码,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码。
2.隐式函数
说明
隐式转换可以在不需改任何代码的情况下,扩展某个类的功能。
案例实操
需求:通过隐式转化为 Int 类型增加方法。
class MyRichInt(val self: Int) {def myMax(i: Int): Int = {if (self < i) i else self}def myMin(i: Int): Int = {if (self < i) self else i}
}
object TestImplicitFunction {// 使用 implicit 关键字声明的函数称之为隐式函数implicit def convert(arg: Int): MyRichInt = {new MyRichInt(arg)}def main(args: Array[String]): Unit = {// 当想调用对象功能时,如果编译错误,那么编译器会尝试在当前作用域范围内查找能调用对应功能的转换规则,这个调用过程是由编译器完成的,所以称之为隐式转换。也称之为自动转换println(2.myMax(6))}
}
3.隐式参数
普通方法或者函数中的参数可以通过 implicit
关键字声明为隐式参数,调用该方法时, 就可以传入该参数,编译器会在相应的作用域寻找符合条件的隐式值。
- 说明
- 同一个作用域中,相同类型的隐式值只能有一个
- 编译器
按照隐式参数的类型去寻找对应类型的隐式值,与隐式值的名称无关
- 隐式参数优先于默认参数
- 案例实操
object TestImplicitParameter {implicit val str: String = "hello world!"def hello(implicit arg: String="good bey world!"): Unit = {println(arg)}def main(args: Array[String]): Unit = {hellohello(123)}
}控制台打印
hello world!
123
4.隐式类
在 Scala2.10 后提供了隐式类,可以使用 implicit
声明类,隐式类的非常强大,同样可以扩展类的功能,在集合中隐式类会发挥重要的作用。
- 隐式类说明
- 其所带的构造参数有且只能有一个
- 隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的。
- 案例实操
object TestImplicitClass {implicit class MyRichInt(arg: Int) {def myMax(i: Int): Int = {if (arg < i) i else arg}def myMin(i: Int) = {if (arg < i) arg else i}}def main(args: Array[String]): Unit = {println(1.myMax(3))}
}
1里面是没有myMax(3)这个方法的,因此编译器就会找到隐式类的MyRichInt( )然后调用隐式类里面的方法
5.隐式解析机制
- 说明
- 首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。(一 般是这种情况)
- 如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。 类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象。
- 案例实操
package com.atguigu.chapter10
import com.atguigu.chapter10.Scala05_Transform4.Teacher// 如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。
// 类型的作用域是指与该类型相关联的全部伴生模块,
object TestTransform extends PersonTrait {def main(args: Array[String]): Unit = {//(1)首先会在当前代码作用域下查找隐式实体val teacher = new Teacher()teacher.eat()teacher.say()}class Teacher {def eat(): Unit = {println("eat...")}}
}
trait PersonTrait {}
object PersonTrait {// 隐式类 : 类型 1 => 类型 2implicit class Person5(user:Teacher) {def say(): Unit = {println("say...")}}
}
Scala隐式转换详解相关推荐
- Scala的隐式转换详解
隐式转换是在Scala编译器进行类型匹配时,如果找不到合适的类型,那么隐式转换会让编译器在作用范围内自动推导出来合适的类型. 1.隐式值与隐式参数 隐式值是指在定义参数时前面加上implicit.隐式 ...
- 3000门徒内部训练绝密视频(泄密版)第5课:彻底精通Scala隐式转换和并发编程及Spark源码阅读
彻底精通Scala隐式转换和并发编程及Spark源码阅读 Akka ,Scala内部并发 隐式转换.隐式类.隐式参数 可以手动指定某种类型的对象或类转换成其他类型的对象或类.转换的原因是假设写好接口 ...
- Scala 隐式转换
隐式参数 object ImplicitPara {def say(implicit content: String) = println(content)def main(args: Array[S ...
- scala 隐式转换与隐式参数
隐式转换函数 指的是以implicit关键字声明的带有单个参数的函数,这种函数会自动引用,将值从一种类型转换为另一种类型.就是说如果类型不匹配时,会自动寻找一个隐式方法,把这个格式不匹配的事情解决掉. ...
- Scala隐式转换之隐式类
隐式转换的目的就是为了扩展功能 隐式解析的机制
- JSP九大隐式对象详解
九大隐式对象可以分为四类 第一类:与输入输出有关的request请求对象response响应对象out输出对象第二类:与作用域范围有关的pageContext页面作用域request请求作用域sess ...
- Scala隐式转换动态丰富类库功能
- scala函数式变程,curry,读取文件,字符串插值,隐式转换,模式匹配
文章目录 scala函数式变程 scala读取文件 字符串插值 scala隐式转换 模式匹配,偏函数,try catch scala函数式变程 object AdFunctionApp {def ma ...
- 隐式转换函数高级使用
Scala隐式转换函数的底层原理 类型不匹配: java:会强制转换 scala:会使用对象的方法进行数据类型转换,隐式转换,scala中只看函数签名(参数列表和返回值) object Scala_L ...
最新文章
- ubuntu下磁道坏区的检测与修复
- CTFshow 命令执行 web121
- WANTS好物CEO李毅秋:初创公司如何避免这些坑
- Android开发三:常用控件1--TextView、EditText、Button
- slf4j注解log报错_SpringBoot自定义日志注解,用于数据库记录操作日志,你用过吗?...
- 读书笔记 - 《乌合之众》
- 可在单片机上运行的简易图形库
- 函数名的使用、闭包、生成器
- .net remoting的事务传播以及wcf分布式事务
- html+css笔记1
- 自然语言处理——用逻辑回归来实现情绪识别
- “购物比价类”Target SDK≥26优秀应用展示
- C#中类的修饰符,this关键字和static关键字
- [JavaScript] 整数金额转汉语数字大写
- excel删除奇数行或者偶数行
- 学嵌入式需要报培训班吗?
- Wireshark分析流量包案例
- 微信公众号(服务号)申请时候需要补充的资料
- 【活动回顾】机智云亮相2020中国移动全球伙伴合作大会
- 设置CentOS开机启动程序及定时关机
热门文章
- SysTick 定时器
- 全国职业院校技能大赛 网络建设与运维 赛题(五)
- Python爬虫Scrapy笔记
- 为什么客户成功(CS)组织在物联网平台即服务(IoTPaas)中至关重要
- 树莓派安装 kodi 19.1
- SAR图像的干涉相位 matlab_时空双缝干涉
- 蓝桥杯——砍竹子问题(C++)
- .360勒索病毒的加密数据怎么处理?|.360勒索病毒数据解密恢复
- Android本科毕业设计基于Android的天气预报APP系统(附带源码)
- Unity3D学习(3)之基于鼠标点击的3D版牧师与魔鬼