Scala学习之路 (八)Scala的隐式转换和隐式参数
一、概念
Scala 2.10引入了一种叫做隐式类的新特性。隐式类指的是用implicit关键字修饰的类。在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换。
隐式转换和隐式参数是Scala中两个非常强大的功能,利用隐式转换和隐式参数,你可以提供优雅的类库,对类库的使用者隐匿掉那些枯燥乏味的细节。
二、作用
隐式的对类的方法进行增强,丰富现有类库的功能
三、隐式参数
1)关键字:implicat
2)隐士的东西只能在object里面才能使用
3)作用域
四、隐式转换函数
是指那种以implicit关键字声明的带有单个参数的函数。
可以通过::implicit –v这个命令显示所有做隐式转换的类。
四、隐士转换的发生的时机
1、当一个对象去调用某个方法,但是这个对象并不具备这个方法
(1)scala源码示例
1是Int类型,从to方法看,Int应该有to方法
打开Int类的源码查看,并没有Int本身并没有to方法,发现Int继承了AnyVal类
查看AnyVal类,发现AnyVal类同样没有to方法,而AnyVal类继承了Any类
Any类里面没有to方法,而在RichInt里面有to方法
而在上面查看scala自动导入隐式转换函数时可以看到有Predef类的intWrapper方法,传入的参数是Int,返回的结果类型是RichInt
(2)快学Scala示例值File和RichFile示例
不使用隐式转换时,使用装饰模式进行读取
- import java.io.File
- import scala.io.Source
- class RichFile(val file : File) {
- //定义一个read方法,返回String类型
- def read():String = Source.fromFile(file.getPath).mkString
- }
- object RichFile{
- //隐式转换方法(将原有的File类型转成了file类型,在用的时候需要导入相应的包)
- //implicit def file2RichFile(file:File) = new RichFile(file)
- }
- object MainApp{
- def main(args: Array[String]): Unit = {
- val file = new File("D:\\student.txt")
- //装饰模式,显示的增强(本来想实现:val contents = file.read(),但是却使用RichFile的方式,所以是显示的增强)
- val rf = new RichFile(file)
- val str = rf.read()
- print(str)
- }
- }
使用隐式转换方式
- import java.io.File
- import scala.io.Source
- class RichFile(val file : File) {
- //定义一个read方法,返回String类型
- def read():String = Source.fromFile(file.getPath).mkString
- }
- object RichFile{
- //隐式转换方法(将原有的File类型转成了file类型,在用的时候需要导入相应的包)
- implicit def file2RichFile(file:File) = new RichFile(file)
- }
- object MainApp{
- def main(args: Array[String]): Unit = {
- //目的是使用File的时候不知不觉的时候直接使用file.read()方法,所以这里就要做隐式转换
- val file = new File("D:\\student.txt")
- //导入隐式转换,._将它下满的所有的方法都导入进去了。
- import RichFile._
- //这里没有的read()方法的时候,它就到上面的这一行中的找带有implicit的定义方法
- val str = file.read()
- //打印读取的内容
- println(str)
- }
- }
(3)超人示例
- class Man(val name:String)
- class SuperMan {
- def fly(): Unit ={
- println("我要上天")
- }
- }
- object SuperMan{
- //隐式转换,将Man转换为SuperMan
- implicit def man2SuperMan(man:Man)=new SuperMan
- def main(args: Array[String]): Unit = {
- new Man("灰太狼").fly
- }
- }
2、调用某个方法的时候,这个方法确实也存在,存入的参数类型不匹配
售票厅卖票
老人和小孩是特殊人群,有单独的买票窗口
- //特殊人群(儿童和老人)
- class SpecialPerson(var name:String)
- //儿童
- class Children(var name:String)
- //老人
- class Older(var name:String)
- //青年工作者
- class Worker(var name:String)
- //特殊人群买票窗口
- class TicketHouse{
- def buyTicket(p:SpecialPerson): Unit ={
- println(p.name + "买到票了")
- }
- }
- object MyPredef{
- //隐式转换,将儿童转换为特殊人群
- implicit def children2SpecialPerson(c:Children)=new SpecialPerson(c.name)
- //隐式转换,将老人转换为特殊人群
- implicit def older2SpecialPerson(o:Older)=new SpecialPerson(o.name)
- }
- object TestBuyTicket{
- def main(args: Array[String]): Unit = {
- //导入MyPredef类中的所有隐式转换
- import MyPredef._
- val house = new TicketHouse
- //测试儿童买票
- val children = new Children("wangbaoqiang")
- house.buyTicket(children)
- //测试老人买票
- val older = new Older("xuzheng")
- house.buyTicket(older)
- //测试青年工作者买票
- val worker = new Worker("huangbo")
- //house.buyTicket(worker)//放开的话会报错
- }
- }
3、视图边界
人狗之恋
- class Person(val name : String) {
- def sayHello: Unit ={
- println("Hello, my name is " + name)
- }
- //2个人交朋友
- def mkFridens(p:Person): Unit ={
- sayHello
- p.sayHello
- }
- }
- class Student(name : String) extends Person(name)
- class Dog(val name : String)
- //聚会时2个人交朋友
- class Party[T <% Person](p1:Person,p2:Person){
- p1.mkFridens(p2)
- }
- object Test{
- //隐式转换,将狗转换成人
- implicit def dog2Person(dog:Dog):Person={
- new Person(dog.name)
- }
- def main(args: Array[String]): Unit = {
- val huangxiaoming = new Person("huangxiaoming")
- val angelababy = new Student("angelababy")
- new Party[Person](huangxiaoming,angelababy)
- println("------------------------------------------------")
- val erlangshen = new Person("erlangshen")
- val xiaotianquan = new Dog("xiaotianquan")
- new Party[Person](erlangshen,xiaotianquan)
- }
- }
Scala学习之路 (八)Scala的隐式转换和隐式参数的更多相关文章
- Spark基础-scala学习(八、隐式转换与隐式参数)
大纲 隐式转换 使用隐式转换加强现有类型 导入隐式转换函数 隐式转换的发生时机 隐式参数 隐式转换 要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可.Scala会自动使用隐式转换函数.隐式转换 ...
- Scala 中的隐式转换和隐式参数
隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...
- Scala隐式转换和隐式参数
隐式转换 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法.通过这些功能, ...
- Scala基础:闭包、柯里化、隐式转换和隐式参数
闭包,和js中的闭包一样,返回值依赖于声明在函数外部的一个或多个变量,那么这个函数就是闭包函数. val i: Int = 20 //函数func的方法体中使用了在func外部定义的变量 那func就 ...
- 12、scala隐式转换与隐式参数
一.隐式转换 1.介绍 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象. 通过这些功能,可以实 ...
- Scala入门到精通——第十九节 隐式转换与隐式參数(二)
作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式參数中的隐式转换 函数中隐式參数使用概要 隐式转换问题梳理 1. 隐式參数中的 ...
- 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数
Scala高级特性 1. 课程目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- 大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值
第八章 面向对象编程-高级8.1 静态属性和静态方法8.1.1 静态属性-提出问题8.1.2 基本介绍8.1.3 伴生对象的快速入门8.1.4 伴生对象的小结8.1.5 最佳实践-使用伴生对象解决小孩 ...
- Scala 学习之路(十三)—— 隐式转换和隐式参数
一.隐式转换 1.1 使用隐式转换 隐式转换指的是以implicit关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能.示例如下: // 普通人 clas ...
随机推荐
- 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库
第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1. 学习方法 2. 多涨见识 3. 比自己强的人一起,学习更强:比自己更聪明的人 ...
- .net防止SQL注入的一种方式
首先也要明白一点,什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将 ...
- Maven构建的Spring项目需要哪些依赖?
Maven构建的Spring项目需要哪些依赖? <!-- Spring依赖 --> <!-- 1.Spring核心依赖 --> <dependency> <g ...
- ubuntu下安装 Sublime Text 3 及 PlantUML 绘图插件
ubuntu下只想做C++的程序代码编写,最开始选择了codeblock,主要目的是安装简单,集成度高,还可以调试,但是用的时候老是无故退出,改了半天的代码就这样丢失,挺苦恼的,可能跟自己装的系统比较 ...
- POJ2398(KB13-B 计算几何)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5968 Accepted: 3573 Descr ...
- pycharm虚拟环境
pycharm虚拟环境 1. 选择一个本地的空目录,---该目录就作为python虚拟环境目录, 2. 选择本地python安装目录: 3. 勾选该选项后则可以使用base interpreter中的 ...
- SD从零开始55-56, 风险管理, 付款卡
[原创] SD从零开始55 风险管理的内容 应收款风险最小化Risk Minimization for Receivables 每个信用政策的目的是减少由客户应收款带来的风险: 连同信用管理,你也有权 ...
- Expo大作战(十二)--expo中的自定义样式Custom font,以及expo中的路由Route&Navigation
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- webpack学习笔记—优化缓存、合并、懒加载等
除了前面的webpack基本配置,还可以进一步添加配置,优化合并文件,加快编译速度.下面是生产环境配置文件webpack.production.js,与wenbpack.config.js相比其不需要 ...
- 《AngularJS权威教程》
第二章.数据绑定 2.2 简单的数据绑定 <!DOCTYPE html> <html ng-app> <head> <title>Simple app& ...