一、概念

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的隐式转换和隐式参数的更多相关文章

  1. Spark基础-scala学习(八、隐式转换与隐式参数)

    大纲 隐式转换 使用隐式转换加强现有类型 导入隐式转换函数 隐式转换的发生时机 隐式参数 隐式转换 要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可.Scala会自动使用隐式转换函数.隐式转换 ...

  2. Scala 中的隐式转换和隐式参数

    隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...

  3. Scala隐式转换和隐式参数

    隐式转换 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法.通过这些功能, ...

  4. Scala基础:闭包、柯里化、隐式转换和隐式参数

    闭包,和js中的闭包一样,返回值依赖于声明在函数外部的一个或多个变量,那么这个函数就是闭包函数. val i: Int = 20 //函数func的方法体中使用了在func外部定义的变量 那func就 ...

  5. 12、scala隐式转换与隐式参数

    一.隐式转换 1.介绍 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象. 通过这些功能,可以实 ...

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

    作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式參数中的隐式转换 函数中隐式參数使用概要 隐式转换问题梳理 1. 隐式參数中的 ...

  7. 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数

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

  8. 大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值

    第八章 面向对象编程-高级8.1 静态属性和静态方法8.1.1 静态属性-提出问题8.1.2 基本介绍8.1.3 伴生对象的快速入门8.1.4 伴生对象的小结8.1.5 最佳实践-使用伴生对象解决小孩 ...

  9. Scala 学习之路(十三)—— 隐式转换和隐式参数

    一.隐式转换 1.1 使用隐式转换 隐式转换指的是以implicit关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能.示例如下: // 普通人 clas ...

随机推荐

  1. 解决jquery绑定click事件出现点击一次执行两次问题

    问题定位:通过浏览器F12定位到点击一次出现两次调用. 问题复现: $("#mail_span").on("click",function(){        ...

  2. [日常] Go语言圣经--复合数据类型,数组习题

    go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...

  3. eclipse中如何向开源中国(码云)上传代码

    摘要 本文将介绍如何将本地的项目提交到开源中国上去,过程比较详细,实现起来很简单.由于自己也算是一个新手,所以没有做过多的解释,只是单纯的描述了该如何去做.   1.在开源中国上面新建一个空项目 到这 ...

  4. 杭电acm习题分类

    专注于C语言编程 C Programming Practice Problems (Programming Challenges) 杭电ACM题目分类 基础题:1000.1001.1004.1005. ...

  5. Mybatis插件开发

    前面几篇文章介绍了Mybtis中四个重要的对象,其中提到它们都是在Configuration中被创建的,我们一起看一下创建四大对象的方法,代码如下所示: public ParameterHandler ...

  6. 使用git将本地仓库同步到github远程仓库

    一.下载安装git客户端windows版本 二.建立本地仓库文件夹 三.在本地仓库里右键点击Git Bash Here 四.初始化本地仓库 [git init] 执行之后仓库中会创建隐藏的文件夹.gi ...

  7. 使用nginx+tomcat将所有请求都转发到一个页面

    1.将页面放到tomcat的root目录下,即ROOT/weihu.html 2.修改nginx配置文件 server{ listen ; # nginx监听的端口 root /opt/apache- ...

  8. DOM相关

    归纳一下, 不管是DOM Core还是HTML-DOM,我们在使用JavaScript的时候要注意浏览器之间的兼容性,因为不同的浏览器对这两类方法和属性的支持可能不一样,一般推荐使用DOM Core方 ...

  9. LOJ1070(SummerTrainingDay05-B 矩阵快速幂)

    Algebraic Problem Given the value of a+b and ab you will have to find the value of an+bn. a and bnot ...

  10. javascript 数组求交集/差集/并集/过滤重复

    最近在小一个小程序项目,突然发现 javscript 对数组支持不是很好,连这些基本的功能,都还要自己封装.网上查了下,再结合自己的想法,封装了一下,代码如下. //数组交集 Array.protot ...