implicit 可分为三种 隐式参数 隐式转换类型 隐式调用函数

1、隐式参数
implicit参数都是定义在方法最后,修饰implicit表示该组参数是隐式参数。一个方法只会有一个隐式参数列表,置于方法的最后一个参数列表。如果方法有多个隐式参数,只需一个implicit修饰即可

//使用隐式参数的方式 需要在外部定义一个Comparator[A]类型的变量def maxThrid[A](first: A, second: A)(implicit cp: Comparator[A]) = {if (cp.compare(first, second) > 0) first else second}//使用implicitly方法 //implicitly是在Predef.scala里定义的,它是一个特殊的方法,编译器会记录当前上下文里的隐式值,而这个方法则可以获得某种类型的隐式值def maxOne[A: Comparator](first: A, second: A) = {val cp = implicitly[Comparator[A]]if (cp.compare(first, second) > 0) first else second}//在内部定义函数并声明隐式参数,这种做法只是把外部方法的隐式参数隐藏了,放到内部嵌套函数上def maxTwo[A: Comparator](first: A, second: A) = {def inner(implicit cp: Comparator[A]) = cp.compare(first, second)if (inner > 0) first else second}def main(args: Array[String]) {//隐式参数implicit val cInt = new Comparator[Int] {override def compare(o1: Int, o2: Int) = o1 - o2}println(maxOne(2, 3))println(maxTwo(4, 1))}

2、隐式转换类型

把变量转换成我们预期想要的类型

   //隐式地转换类型implicit def doubleToInt(a:Double):Int = a.toInt//这里3.5就会转换成int类型,如果没有上面的隐式转换就会编译出错val i:Int = 3.5println(i)

3、隐式调用函数

就是我们使用的对象可能不存在某个方法,但是另外一个对象存在,那么我们隐式的转换成那个存在某个方法的对象,来进行操作

class Anime{def say = println("hello!")
}class Dogobject ImplicitAnime{implicit def dogToAnime(d:Dog):Anime = new Anime
}//隐式调用函数 Dog并没有say函数,但是通过dogToAnime隐式方法转换成Anime实例就存在say方法
//编译器通过隐式转换将对象转换成具有这个方法的对象
val d = new Dog
import com.aralbox.scala.study42.ImplicitAnime._
d.say

4、下面是更复杂的例子

package com.aralbox.scala.study42object implicitType {def main(args: Array[String]) {val p = Person("Tom", 32)//scala2.8 加入了def implicitly[T](implicit e: T): T = e 方法val s = implicitly[Show[Person]].show(p)println(s)//si指定给implicitly方法表明si自动去查找隐式参数 //ss指定ShoutyStringShow方法,因为ShoutyStringShow方法也是返回Show[String]所以匹配ss参数类型val s1 = Person.personShow(si = implicitly, ss = Show.ShoutyStringShow ).show(p)println(s1)}
}trait Show[T] {def show(t: T): String
}object Show {//隐式转换Show[Int]implicit def intShow: Show[Int] = new Show[Int] {def show(i: Int): String = i.toString}//隐式转换Show[String]implicit def strShow: Show[String] = new Show[String] {def show(s: String): String = s}def ShoutyStringShow: Show[String] = new Show[String] {def show(s: String): String = s.toUpperCase()}
}case class Person(name: String, age: Int)object Person{//隐式转换Show[Person]  //personShow里面有2个隐式参数Show[String]和Show[Int]//它会发现在Show对象里面存在Show[String]和Show[Int]隐式参数定义implicit def personShow(implicit ss:Show[String], si:Show[Int]):Show[Person] = new Show[Person]{def show(p: Person) = "Person(name=" + ss.show(p.name) + ", age=" + si.show(p.age) + ")"}
}

scala学习笔记(十三):implicit 详解相关推荐

  1. ELK学习笔记之Logstash详解

    0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...

  2. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell命令,比如说 ...

  3. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  4. oracle scn 重置,学习笔记:Oracle SCN详解 SCN与Oracle数据库恢复的关系

    天萃荷净 分享一篇关于Oracle SCN的详解,介绍SCN与Oracle数据库恢复的关系和SCN在数据库中的作用 一.为什么需要System checkpoint SCN号与Datafile Che ...

  5. PyQt5学习笔记——一文详解QObject

    QObject详解笔记1 一.简介 QObject是所有Qt对象的基类 二.功能作用 2.1 对象名称.属性 2.1.1 API setObjectName("唯一名称") 给QT ...

  6. shell入门学习笔记-12-命令详解: echo与printf

    系列目录与参考文献传送门: shell入门学习笔记-序章 命令详解 admindeMacBook-Pro:myshell admin$ type cd cd is a shell builtin ad ...

  7. CoAP学习笔记——CoAP格式详解

    0 前言 CoAP是受限制的应用协议(Constrained Application Protocol)的代名词.在当前由PC机组成的世界,信息交换是通过TCP和应用层协议HTTP实现的.但是对于小型 ...

  8. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

  9. CoAP协议学习笔记——CoAP格式详解

    CoAP是受限制的应用协议(Constrained Application Protocol)的代名词.在当前由PC机组成的世界,信息交换是通过TCP和应用层协议HTTP实现的.但是对于小型设备而言, ...

最新文章

  1. 任务流程管理,从繁杂的项目管理中解脱出来
  2. Centos7 Docker Compose部署mysql5.7
  3. RabbitMQ学习总结(2)——安装、配置与监控
  4. 把HTML转成PDF的4个方案及实现方法
  5. Quartus II与 ModelSim功能仿真与后仿真扫盲(转)
  6. 边打工边研究数学 泸州“农民数学家”出版15本著作
  7. 矩阵水平翻转java,通过翻转1的矩阵的行和列来确定是否可以到达给定二进制矩阵的算法...
  8. Java多线程学习二十六:原子类是如何利用 CAS 保证线程安全的?
  9. 怎么禁用计算机的可信执行,英特尔®融合安全和管理引擎、英特尔®服务器平台服务、英特尔®可信执行引擎和英特尔®主动管理技术咨询 (intela-sa-00185)...
  10. Deep-Clustering-for-Unsupervised-Learning-of-Visual-Features
  11. ios 7.1.2 拍照声音
  12. win10+Xming+Xshell显示远程linux服务器的图形程序窗口
  13. Excel文件输出到浏览器
  14. java反射机制原理详解
  15. 开源免费etl作业批量调度必备软件 Taskctl Free应用版
  16. Linux虚拟网络设备之bridge(桥)
  17. PR基础学习(二) 导入和预览素材视频
  18. iphone编程资源站
  19. html5允许属性值不使用引号,HTML5概述 - 阿振的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. 01 HA haproxy 功能简介以及应用

热门文章

  1. ./configure 自动生成makefile
  2. 让IIS支持PHP (转载)
  3. 联想Y700原厂3165AC更换AX200无线网卡【彪悍的小Y】本机真实验证!!!!
  4. 如何下载网页中使用的JS及CSS文件
  5. Linux - Unix环境高级编程(第三版) 代码编译
  6. Jenkins Windons下安装ChangeLog插件获取Git更新日志
  7. SQL Server 的几个故障
  8. quartz简单配置
  9. 密码学的中文入门书籍及课程推荐
  10. 超全面,带你了解UI设计全流程!