文章地址:http://www.haha174.top/admin/article/list
1.引言

scala 提供的隐式转换和隐式参数功能,是非常有特色的功能。是java 等编程语言所没有的功能。是java 等编程语言所没有的功能。它可以允许你手动指定,将某种类型的对象转换成其他类型的对象。通过这些功能,可以实现非常强大,而且特殊的功能。
Scala 的隐式转换,其实最核心的就是定义隐式转换函数,即implicit conversion function .定义的隐式转换函数,只要在编写的程序内引入,就会被scala 自动使用。scala 会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收得参数类型定义得对象时,会自动将其传入到隐式转换函数,转换为另外一种类型得对象并返回。这就是隐式转换。
隐式转换函数叫什么名字无所谓得,因为通常不会由用户手动调用,而是由scala 进行调用。但是如果要使用隐式转换,则需要对隐式转换函数进行导入。因此通常建议将隐式转换函数得名称命名为one2one 得形式。

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学习之旅(十三):隐式转换和隐式参数相关推荐

  1. Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...

    Scala高级特性 1.    学习目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  2. 2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数

    目录 隐式转换和隐式参数 隐式转换 自动导入隐式转换方法 隐式转换的时机 隐式参数 隐式转换和隐式参数 隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能.我们可以很 ...

  3. scala中的隐式转换、隐式参数和隐式类

    scala中的隐式转换.隐式参数和隐式类 @(SCALA)[scala] scala中的隐式转换隐式参数和隐式类 一隐式转换 1示例 2隐式转换的条件 二隐式参数 1示例 三隐式类 1示例 隐式转换是 ...

  4. Scala入门到精通——第十九节 隐式转换与隐式参数(二)

    本节主要内容 隐式参数中的隐式转换 函数中隐式参数使用概要 隐式转换问题梳理 1. 隐式参数中的隐式转换 前一讲中,我们提到函数中如果存在隐式参数,在使用该函数的时候如果不给定对应的参数,则编译器会自 ...

  5. Scala入门到精通——第十八节 隐式转换与隐式参数(一)

    本节主要内容 隐式转换简介 隐式转换函数 隐式转换规则 隐式参数 1. 隐式转换简介 在Scala语言当中,隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性.要想 ...

  6. scala入门-10 隐式转换、隐式参数、隐式类

    到目前为止,隐式转换是scala的重点和难点了,加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子: 上面的例子中使用了隐式参数,我们也可以明显的指明参数: 下面看一下 ...

  7. scala 隐式转换与隐式参数

    隐式转换函数 指的是以implicit关键字声明的带有单个参数的函数,这种函数会自动引用,将值从一种类型转换为另一种类型.就是说如果类型不匹配时,会自动寻找一个隐式方法,把这个格式不匹配的事情解决掉. ...

  8. Scala隐式转换之隐式类

    隐式转换的目的就是为了扩展功能 隐式解析的机制

  9. mysql日期隐式转换_MySQL 隐式转换 | 剑花烟雨江南

    MySQL 隐式转换的规则如下: 1. 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回1,这两种都不需要做类型转换. 2 ...

最新文章

  1. PYTHON的主模块
  2. leetcode 1030. 距离顺序排列矩阵单元格(bfs)
  3. 两台linux之间互传php脚本,linux下两台服务器实现同步的方法
  4. html 怎么显示在投影下面,投影仅底部css3
  5. 揭秘!月薪30K的大牛到底看了哪些视频?【共2000G】
  6. ERROR 程序出错,错误原因:'bytes' object has no attribute 'read'
  7. 蚂蚁技术专家:一篇文章带你学习分布式事务
  8. [源码]C# to SQL 的翻译器.net 1.1版
  9. HDU6278 Just h-index
  10. cn域名注册国外_国内注册域名有什么规则?有什么要求?
  11. 随机微分方程学习笔记01 相对布朗运动的Ito积分
  12. ASP的工作原理和运行环境
  13. l/min是什么单位
  14. easyui Datagrid的deleteRow多行移除问题
  15. python xls和xlsx互转
  16. 关于部署OOS时出现的证书问题解决
  17. Marvell车载交换机88Q5050, 88Q5072 VLAN配置(一)------VLAN的基本原理
  18. python 针对二分类问题画roc曲线
  19. 13k 的 macOS 窗口管理工具
  20. 网课查题公众号 对接查题题库

热门文章

  1. 如何删除我们的应用在 AppStore 中的负面评论
  2. Impala: Reducing query concurrency or configuring admission control may help avoid this error
  3. 使用node的Hapi框架搭建后台(一)——搭建项目
  4. python:实现balanced parentheses平衡括号表达式算法(附完整源码)
  5. flask入门和进阶五(关注功能的实现Followers)
  6. 软件工程(3)微信抢票应用个人总结
  7. 《活出生命的意义》节选
  8. 打开服务器网页要5秒,网页优化技巧 如何把网页加载时间控制在1.5秒以内
  9. Win32创建菜单篇
  10. 计算机操作系统-磁盘存储器