scala学习之旅(十三):隐式转换和隐式参数

转载 2018年04月14日 22:29:03

文章地址: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 = 0
  def 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 SignPen

def signForExam(name: String) (implicit signPen: SignPen) {
  signPen.write(name + " come to exam in time.")
}

欢迎关注,更多福利

这里写图片描述

Scala学习笔记6 - 隐式转换和隐式参数

===显式类型转换       正如之前所述的,scala中类型转换使用方法实现,以下是显式类型测试和显式类型转换的示例:                a.isInstanceOf[String] ...
  • guohecang
  • guohecang
  • 2016-08-04 11:53:33
  • 546

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

本节主要内容 隐式转换简介 隐式转换函数 隐式转换规则 隐式参数 1. 隐式转换简介在scala语言当中,隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性。要想更...
  • lovehuangjiaju
  • lovehuangjiaju
  • 2015-08-05 21:09:03
  • 12066

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

scala入门-10 隐式转换、隐式参数、隐式类 scala入门-10 隐式转换、隐式参数、隐式类 scala入门-10 隐式转换、隐式参数、隐式类 scala入门-10 隐式转换、隐式参数、隐式类 ...
  • stark_summer
  • stark_summer
  • 2015-01-13 18:40:22
  • 22328

Scala泛型、隐式转换和隐式参数、视图介绍、Scala中的上界、下界、结合柯里化进行隐式转换

二、泛型一、Scala泛型 1. 泛型介绍 泛型用于指定方法或类可以接受任意类型参数,参数在实际使用时才被确定,泛型可以有效地增强程序的适用性,使用泛型可以使得类或方法具有更强的通用性。泛型的典型...
  • toto1297488504
  • toto1297488504
  • 2017-07-01 23:25:27
  • 641

【Scala类型系统】隐式转换与隐式参数

隐式转换隐式转换是使用implicit修饰的带有单个参数的普通函数。这种函数将自动应用,将值从一种类型转换为另一种类型。 举例说明: 我们想将整数n转换为分数n/1, 定义implicit...
  • JasonDing1354
  • JasonDing1354
  • 2016-02-27 21:35:31
  • 1230

快学Scala学习笔记及习题解答(21-22隐式转换和隐式参数、定界延续)

本文Scala使用的版本是2.11.8第21章 隐式转换和隐式参数21.1 基本概念所谓隐式转换函数(implicit conversion function)指的是那种以implicit关键字声明的...
  • u013980127
  • u013980127
  • 2017-03-23 09:52:14
  • 791

Scala 隐式类型之隐式参数

Scala 隐式参数介绍及示例,隐式转换和隐式参数结合示例。
  • yyywyr
  • yyywyr
  • 2016-01-03 17:48:55
  • 2566

Scala入门之隐式转换与隐式参数

1.隐式转换 隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性。隐式函数的名称对结构没有影响.函数可以是任何名字,只看参数与返回,也就是看能不能传入的参数是...
  • pofengliuming
  • pofengliuming
  • 2016-08-07 23:11:00
  • 427

scala学习之:隐式转换与隐式参数

隐式转换        隐式转换与隐式参数都是增强类库功能的一种方式,Java中使用工具类、继承的方式来实现。        隐式转换主要体现在:使用A的对象实例,调用B的方法。        ...
  • mzygssk
  • mzygssk
  • 2015-08-27 23:05:24
  • 280

Scala学习—隐式转换与隐式参数

scala隐式转换,其实最核心的就是定义意识转换函数,即implicit conversion function。定义的隐式转换函数,只要在编写的程序内引入,就会被scala自动使用。scala会根据...
  • sunhaoning
  • sunhaoning
  • 2017-07-26 13:59:10
  • 116
收藏助手
不良信息举报
您举报文章:scala学习之旅(十三):隐式转换和隐式参数
举报原因:
原因补充:

(最多只允许输入30个字)