scala学习之旅(十三):隐式转换和隐式参数
文章地址:http://www.haha174.top/admin/article/list
1.引言
2.隐式转换
// 要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可。Scala会自动使用隐式转换函数。隐式转换函数与普通函数唯一的语法区别就是,要以implicit开头,而且最好要定义函数返回类型。// 案例:特殊售票窗口(只接受特殊人群,比如学生、老人等)
class SpecialPerson(val name: String)
class Student(val name: String)
class Older(val name: String)implicit def object2SpecialPerson (obj: Object): SpecialPerson = {if (obj.getClass == classOf[Student]) { val stu = obj.asInstanceOf[Student]; new SpecialPerson(stu.name) }else if (obj.getClass == classOf[Older]) { val older = obj.asInstanceOf[Older]; new SpecialPerson(older.name) }else Nil
}var ticketNumber = 0
def buySpecialTicket(p: SpecialPerson) = {ticketNumber += 1"T-" + ticketNumber
}
3.使用隐式转换加强现有类型
// 隐式转换非常强大的一个功能,就是可以在不知不觉中加强现有类型的功能。也就是说,可以为某个类定义一个加强版的类,并定义互相之间的隐式转换,从而让源类在使用加强版的方法时,由Scala自动进行隐式转换为加强类,然后再调用该方法。// 案例:超人变身class Man(val name: String)
class Superman(val name: String) {def emitLaser = println("emit a laster!")
}implicit def man2superman(man: Man): Superman = new Superman(man.name)val leo = new Man("leo")
leo.emitLaser
4.隐式转换函数作用域与导入
1 // Scala默认会使用两种隐式转换,一种是源类型,或者目标类型的伴生对象内的隐式转换函数;一种是当前程序作用域内的可以用唯一标识符表示的隐式转换函数。
2
3 // 如果隐式转换函数不在上述两种情况下的话,那么就必须手动使用import语法引入某个包下的隐式转换函数,比如import test._。通常建议,仅仅在需要进行隐式转换的地方,比如某个函数或者方法内,用iimport导入隐式转换函数,这样可以缩小隐式转换函数的作用域,避免不需要的隐式转换。
5.隐式转换的发生时机
// 1、调用某个函数,但是给函数传入的参数的类型,与函数定义的接收参数类型不匹配(案例:特殊售票窗口)
// 2、使用某个类型的对象,调用某个方法,而这个方法并不存在于该类型时(案例:超人变身)
// 3、使用某个类型的对象,调用某个方法,虽然该类型有这个方法,但是给方法传入的参数类型,与方法定义的接收参数的类型不匹配(案例:特殊售票窗口加强版)// 案例:特殊售票窗口加强版
class TicketHouse {var ticketNumber = 0def buySpecialTicket(p: SpecialPerson) = {ticketNumber += 1"T-" + ticketNumber}
}
6.隐式参数
// 所谓的隐式参数,指的是在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数。
// Scala会在两个范围内查找:一种是当前作用域内可见的val或var定义的隐式变量;一种是隐式参数类型的伴生对象内的隐式值// 案例:考试签到
class SignPen {def write(content: String) = println(content)
}
implicit val signPen = new SignPendef signForExam(name: String) (implicit signPen: SignPen) {signPen.write(name + " come to exam in time.")
}
欢迎关注,更多惊喜等着你
scala学习之旅(十三):隐式转换和隐式参数相关推荐
- Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...
Scala高级特性 1. 学习目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- 2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数
目录 隐式转换和隐式参数 隐式转换 自动导入隐式转换方法 隐式转换的时机 隐式参数 隐式转换和隐式参数 隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能.我们可以很 ...
- scala中的隐式转换、隐式参数和隐式类
scala中的隐式转换.隐式参数和隐式类 @(SCALA)[scala] scala中的隐式转换隐式参数和隐式类 一隐式转换 1示例 2隐式转换的条件 二隐式参数 1示例 三隐式类 1示例 隐式转换是 ...
- Scala入门到精通——第十九节 隐式转换与隐式参数(二)
本节主要内容 隐式参数中的隐式转换 函数中隐式参数使用概要 隐式转换问题梳理 1. 隐式参数中的隐式转换 前一讲中,我们提到函数中如果存在隐式参数,在使用该函数的时候如果不给定对应的参数,则编译器会自 ...
- Scala入门到精通——第十八节 隐式转换与隐式参数(一)
本节主要内容 隐式转换简介 隐式转换函数 隐式转换规则 隐式参数 1. 隐式转换简介 在Scala语言当中,隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性.要想 ...
- scala入门-10 隐式转换、隐式参数、隐式类
到目前为止,隐式转换是scala的重点和难点了,加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子: 上面的例子中使用了隐式参数,我们也可以明显的指明参数: 下面看一下 ...
- scala 隐式转换与隐式参数
隐式转换函数 指的是以implicit关键字声明的带有单个参数的函数,这种函数会自动引用,将值从一种类型转换为另一种类型.就是说如果类型不匹配时,会自动寻找一个隐式方法,把这个格式不匹配的事情解决掉. ...
- Scala隐式转换之隐式类
隐式转换的目的就是为了扩展功能 隐式解析的机制
- mysql日期隐式转换_MySQL 隐式转换 | 剑花烟雨江南
MySQL 隐式转换的规则如下: 1. 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回1,这两种都不需要做类型转换. 2 ...
最新文章
- PYTHON的主模块
- leetcode 1030. 距离顺序排列矩阵单元格(bfs)
- 两台linux之间互传php脚本,linux下两台服务器实现同步的方法
- html 怎么显示在投影下面,投影仅底部css3
- 揭秘!月薪30K的大牛到底看了哪些视频?【共2000G】
- ERROR 程序出错,错误原因:'bytes' object has no attribute 'read'
- 蚂蚁技术专家:一篇文章带你学习分布式事务
- [源码]C# to SQL 的翻译器.net 1.1版
- HDU6278 Just h-index
- cn域名注册国外_国内注册域名有什么规则?有什么要求?
- 随机微分方程学习笔记01 相对布朗运动的Ito积分
- ASP的工作原理和运行环境
- l/min是什么单位
- easyui Datagrid的deleteRow多行移除问题
- python xls和xlsx互转
- 关于部署OOS时出现的证书问题解决
- Marvell车载交换机88Q5050, 88Q5072 VLAN配置(一)------VLAN的基本原理
- python 针对二分类问题画roc曲线
- 13k 的 macOS 窗口管理工具
- 网课查题公众号 对接查题题库
热门文章
- 如何删除我们的应用在 AppStore 中的负面评论
- Impala: Reducing query concurrency or configuring admission control may help avoid this error
- 使用node的Hapi框架搭建后台(一)——搭建项目
- python:实现balanced parentheses平衡括号表达式算法(附完整源码)
- flask入门和进阶五(关注功能的实现Followers)
- 软件工程(3)微信抢票应用个人总结
- 《活出生命的意义》节选
- 打开服务器网页要5秒,网页优化技巧 如何把网页加载时间控制在1.5秒以内
- Win32创建菜单篇
- 计算机操作系统-磁盘存储器